Response.TransmitFile corrupting file - c#

I have a file on my server or well in this localhost. I want to transmit it to user using this code:
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Disposition", "attachment; filename=buylist.pdf");
Response.TransmitFile(Server.MapPath("~/buylist.pdf"));
Response.ContentType = "application/csv";
Response.AppendHeader("Content-Disposition", "attachment; filename=buylist.csv");
Response.TransmitFile(Server.MapPath("~/buylist.csv"));
I know the file I am trying to transmit our fine and I even tried adding Response.Close() but each time the file is corrupted. The csv give me the page's HTML. I am really lost.

Try putting a Response.Clear() at the top of this code, and a Response.End() and bottom.
Also, it looks like you're trying to transmit two files in one response, and that just won't work. It might also be two versions of the code showing in the same snippet in your question, but this is still worth mentioning: You need to pick one file to return in one response. If you absolutely must return two files at once, you'll have to zip or tar them together first. There is no way to send two files with the same response.

Related

Outputting .RTF file to response Corrupt

I have an AJAX file uploader on my page, and use this to store various different file types into a database, However when I store a .rtf file and then try to output this using response, I get a file corrupt and cannot be opened error message. The file uploader automatically detects the mime type of the file on upload and stores the file as "application/msword" as this didn't work I tried giving it several other mime types however none of them worked.
Does anyone know of any reasons why this file may be corrupt?
PS. I have also tried uploading several different .rtf files with text, no text and images, etc. however none of them worked. output code below:
context.Response.Clear();
context.Response.ClearHeaders();
context.Response.ClearContent();
context.Response.ContentType = displayFile.MimeType;
context.Response.AddHeader("content-disposition", "attachment; filename=" + displayFile.FileName);
context.Response.BinaryWrite(displayFile.Data);
context.Response.End();

Show PDF FILE within an asp ModalPopupExtender using C# asp.net

I need to show a pdf file that is saved in the database and show it using an asp ModalPopupExtender
I have the fallowing code
Byte[] PDF = t.ReturnPDF(NamePDF);
Response.ContentType = "application/pdf";
Response.AddHeader("content-length", "attachment; filename=" + "NamePDF");
Response.BinaryWrite(PDF);
Response.Flush();
Response.Close();
This works fine (it shows the pdf in the web site) however I don’t know how to show it inside of an asp ModalPopupExtender. Any suggestions or something you have done similar that can resolve my issue?
Thank you so much.
You would have to use an iFrame. However, you're going to run into browser issues as not all browsers can render PDFs inline. See this related answer from aam1r here

Amazon S3 - MS office files corrupted when downloading

When I upload a docx, xlsx or pptx to amazon S3 using aws .net sdk the file is getting uploaded fine and I am able to view the file directly from S3 without any issues. But when I download the file in ASP.net using C# I am getting a warning message (see below) when opening the file:
"Excel found unreadable content in test.xlsx. Do you want to recover the contents of this workbook?" If I click yes, I am able to see all the contents in the document.
similarly I am getting a warning message for .docx file as well.
This is the C# code I am using:
Response.Clear();
Response.ContentType = "application/octet-stream";
Response.AddHeader("content-disposition", "attachment; filename=" + fileName);
Response.OutputStream.Write(Content, 0, Content.Length);
Response.Flush();
HttpContext.Current.ApplicationInstance.CompleteRequest();
Update: When I download the file in windows forms app it is working fine and the problem is with web app only.
What am I doing wrong?
Please help...
More information is needed to figure this out. The code snippet you provided looks OK. The problem looks to be elsewhere in your code... For example, what are you loading inside "Content"?
Also, it would help if you tried uploading and downloading a simple text file, to see what kind of data gets appended.
If Content is a byte[] created from a MemoryStream, make sure you're calling .ToArray() and not .GetBuffer() to get it. If you use .GetBuffer(), you'll potentially get extra bytes on the end, which the office file format probably doesn't like. Your other file types you've tried it with might be more tolerant of extra data they weren't expecting on the end.

Streaming PowerPoint file in ASP.NET

I am generating PowerPoint decks and then merging them on the fly and then streaming the resulting content via HttpResponse object i.e.
HttpResponse response = HttpContext.Current.Response;
response.Clear();
response.AppendHeader("Content-Type", "application/vnd.ms-powerpoint");
response.AppendHeader("Content-Disposition", "attachment;filename=MasterPresentation.pptx;");
response.BinaryWrite(masterPresentation.ToArray());
response.Flush();
response.Close();
Where masterPresentation is a MemoryStream object. When I open the downloaded Presentation in PowerPoint I get this message:
PowerPoint found a problem with content in MasterPresentation.pptx. PowerPoint can attempt to repair the presentation.
Upon repair everything seems fine no content corruption what so ever.
I am answering my own question, In case anyone else needs to resolve this issue, all you need to do is replace:
response.Flush();
response.Close();
with
response.End();
catching any exceptions and the resulting presentation will not be corrupted.

Folder Browser Dialog Box in ASP.Net

I've created a word document generator in C sharp and I want that generated word document to be save in a specific place in the client. I'm looking for a similar functionality like FolderBrowserDialog in Windows Form. I'm using ASP.Net and I tried may solutions but still no luck. Anyone can help me.
No! server (web-app) program don't have an ability to save a generated document at specific place at client.
try to use the HttpResponse in behind's code:
like:
// Clear the content of the response
Response.ClearContent();
// Add the file name and attachment, which will force the open/cancel/save dialog box to show, to the header
Response.AddHeader("Content-Disposition", "attachment; filename=" + savedNameWithExtension);
// Add the file size into the response header
Response.AddHeader("Content-Length", myfile.Length.ToString());
// Set the ContentType
Response.ContentType = ReturnExtension(myfile.Extension.ToLower());
// Write the file into the response (TransmitFile is for ASP.NET 2.0. In ASP.NET 1.1 you have to use WriteFile instead)
Response.TransmitFile(myfile.FullName);
// End the response
Response.End();
This section of code will prompt the user to save the specified file on a certain location on his machine.
Hope this is clear.
When you download a file from the browser its the browser to show the save file dialog and this works on all browsers and on all platforms. Just keep the default behavior and let users decide location and file name. I guess any hacky implementation of that part if possible at all, it is likely to break in some browsers or platforms, like mac, ipad, android...
you do not need to specify any control to be used, once you call the methods to download a file like
Response.WriteFile or Response.BinaryWrite or any other, the browser takes care of everything else for you and let it be like that ;-)

Categories