Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# File Download is Corrupt

I've got some C# in a utility for a Web API project. The upload portion of the code works fine; I've verified the file that gets to the server matches the file that was uploaded. However, something is happening in the download that causes the client to view the file as corrupted, and when I do a diff I can see that something went wrong.

Code Compare diff of the files

Unfortunately, I can't figure out what I'm doing wrong. The relevant parts of the utility are as follows:

public static HttpResponseMessage StreamResponse(this HttpRequestMessage request, Stream stream)
{
    if (stream.CanSeek) stream.Position = 0;// Reset stream if possible

    HttpResponseMessage response = request.CreateResponse(HttpStatusCode.OK);
    response.Content = new StreamContent(stream);
    if (stream is FileStream)
    {// If this is a FileStream, might as well figure out the content type
        string mimeType = MimeMapping.GetMimeMapping(((FileStream)stream).Name);
        response.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(mimeType);
    }
    return response;
}

public static HttpResponseMessage DownloadAs(this HttpResponseMessage response, string fileName)
{
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
    response.Content.Headers.ContentDisposition.FileName = fileName;
    response.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(MimeMapping.GetMimeMapping(fileName));
    return response;// For chaining or whatnot
}

My usage in the API controllers is return ResponseMessage(Request.StreamResponse(stream).DownloadAs("Filename.ext"));

I've double checked code for downloading, and this seems to match up with what I've found. What am I doing wrong or what am I missing? It looks like something's wrong with the encoding or charset, but I can't tell what the solution is.

like image 635
ricksmt Avatar asked Feb 01 '26 11:02

ricksmt


1 Answers

Finally figured out the issue thanks to this Q&A. I was missing the responseType option/parameter in my $http call in the client-side code.

like image 51
ricksmt Avatar answered Feb 03 '26 01:02

ricksmt