Can't download files from web services

173 views Asked by At

I am facing a problem while i downloading files from my API web services . When I tested it in advanced rest client . i didn't get my file but i 'v get characters .here is my http://41.128.183.109:1212/api/Data/get filename = claims.jpg

screen shots from my web service : enter image description here here is my response : enter image description here

here is my code :

 public HttpResponseMessage get ([FromUri]string filename)
{
    string path = HttpContext.Current.Server.MapPath("~/TransientStorage/" + filename);
    if (!File.Exists(path))
    {
        throw new HttpResponseException( HttpStatusCode.NotFound);
    }

    try
    {
        MemoryStream responseStream = new MemoryStream();
        Stream fileStream = File.Open(path, FileMode.Open);
        bool fullContent = true;
        if (this.Request.Headers.Range != null)
        {
            fullContent = false;

            // Currently we only support a single range.
            RangeItemHeaderValue range = this.Request.Headers.Range.Ranges.First();


            // From specified, so seek to the requested position.
            if (range.From != null)
            {
                fileStream.Seek(range.From.Value, SeekOrigin.Begin);

                // In this case, actually the complete file will be returned.
                if (range.From == 0 && (range.To == null || range.To >= fileStream.Length))
                {
                    fileStream.CopyTo(responseStream);
                    fullContent = true;
                }
            }
            if (range.To != null)
            {
                // 10-20, return the range.
                if (range.From != null)
                {
                    long? rangeLength = range.To - range.From;
                    int length = (int)Math.Min(rangeLength.Value, fileStream.Length - range.From.Value);
                    byte[] buffer = new byte[length];
                    fileStream.Read(buffer, 0, length);
                    responseStream.Write(buffer, 0, length);
                }
                // -20, return the bytes from beginning to the specified value.
                else
                {
                    int length = (int)Math.Min(range.To.Value, fileStream.Length);
                    byte[] buffer = new byte[length];
                    fileStream.Read(buffer, 0, length);
                    responseStream.Write(buffer, 0, length);
                }
            }
            // No Range.To
            else
            {
                // 10-, return from the specified value to the end of file.
                if (range.From != null)
                {
                    if (range.From < fileStream.Length)
                    {
                        int length = (int)(fileStream.Length - range.From.Value);
                        byte[] buffer = new byte[length];
                        fileStream.Read(buffer, 0, length);
                        responseStream.Write(buffer, 0, length);
                    }
                }
            }
        }
        // No Range header. Return the complete file.
        else
        {
            fileStream.CopyTo(responseStream);
        }
        fileStream.Close();
        responseStream.Position = 0;

        HttpResponseMessage response = new HttpResponseMessage();
        response.StatusCode = fullContent ? HttpStatusCode.OK : HttpStatusCode.PartialContent;
        response.Content = new StreamContent(responseStream);
        return response;
    }
    catch (IOException)
    {
        throw new HttpResponseException( HttpStatusCode.InternalServerError);

    }

}
2

There are 2 answers

1
Sebastian Kliś On

I think you did get your file. This is how jpg file looks like (at least header looks ok). It's in byte format and not rendered as a image, though. Try storing it on hard drive as *.jpg file or displaying using img tag.

5
CrawlingKid On

Add content type in the response object.

 HttpResponseMessage response = new HttpResponseMessage();
        response.StatusCode = fullContent ? HttpStatusCode.OK : HttpStatusCode.PartialContent;
        response.Content = new ByteArrayContent(responseStream.ToArray());
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
        return response;