2009-07-02 5 views
25

Мне нужно написать несколько отчетов, а затем попросить пользователя сохранить его на своем локальном компьютере. В последний раз, когда я это сделал, я написал файл на веб-сервер, а затем отправил его клиенту через объект Response.C# Asp.net написать файл клиенту

создать на веб-сервере

TextWriter tw = new StreamWriter(filePath); 

отправить клиенту

page.Response.WriteFile(path); 

Вопрос заключается в том, есть ли способ, чтобы пропустить запись физического файла на веб-сервере и идти прямо из объект, который представляет документ для ответа?

ответ

25

Вы можете использовать Response.ContentType как этот

Response.ContentType = "text/plain"; 
Response.OutputStream.Write(buffer, 0, buffer.Length); 
Response.AddHeader("Content-Disposition", "attachment;filename=yourfile.txt"); 

Это, конечно, работает, если вы хотите, чтобы написать текстовый файл. Если вы хотите написать .doc, например, вы изменяете ContentType на «application/msword» и т. Д.

+0

этот код пишет пишите в мой браузер. Я не получаю подсказки. IReport rpt = новый ContxReport(); строка report = rpt.makeReport(); ASCIIEncoding encoding = new ASCIIEncoding(); byte [] encodedReport = encoding.GetBytes (отчет); Ответ.ContentType = "text/plain"; Response.OutputStream.Write (encodedReport, 0, encodedReport.Length); Response.AddHeader («Content-Disposition», «inline; filename = shit.csv»); Response.End(); – jim

+1

Кроме того, перед записью вы должны установить все заголовки. – Talljoe

+1

Что такое *** буфер ***? – Kiquenet

16

Вы можете.

Попробуйте это:

Table oTable = new Table(); 
//Add data to table. 

Response.Clear(); 
Response.Buffer = true; 
Response.ContentType = "application/vnd.ms-excel"; 
Response.AddHeader("Content-Disposition", "attachment;filename="test.xls""); 
Response.Charset = ""; 
this.EnableViewState = false; 
System.IO.StringWriter oStringWriter = new System.IO.StringWriter(); 
System.Web.UI.Html32TextWriter oHtmlTextWriter = new System.Web.UI.Html32TextWriter(oStringWriter); 
0Table.RenderControl(oHtmlTextWriter); 
Response.Write(oStringWriter.ToString()); 
Response.End(); 

Это даст предложит пользователю открыть или сохранить файл test.xls. аналогичным образом вы можете предоставить другие объекты ASP.NET вместо таблицы.

+0

Вы должны иметь возможность использовать Response.Output вместо создания StringWriter. – Talljoe

+0

У меня есть 2 вопроса. 1) Будет ли это возобновление файла.? и 2) Возможны ли множественные соединения, если вы используете диспетчер загрузки, например IDM и т. д.? – shashwat

+2

@ShashwatTripathi Я не уверен. Это был фрагмент кода, который я использовал давно. IMHO, он не будет поддерживать возобновление или несколько подключений для загрузки. –

5

Да.

page.Response.WriteFile(yourData, 0, yourData.Length); 
+0

У меня есть 2 вопроса. 1) Будет ли это возобновление файла.? и 2) Возможны ли множественные соединения, если вы используете диспетчер загрузки, например IDM и т. д.? – shashwat

5

Точный ответ на этот вопрос зависит от того, как вы организовали отчет (т.е. то, что «объект» вы имеете в виду). Если у вас есть одна строка, вы можете использовать Response.Write, чтобы просто написать ее. Если вам нужен TextWriter, Response.Output - это то, что вы хотите - таким образом вы можете пропустить запись на диск, а затем с помощью WriteFile. Кроме того, если ваш контент оказался двоичным, для этого вы можете использовать Response.OutputStream.

Возможно, вы также захотите установить Response.AddHeader («Content-Disposition», «attachment»), если вы хотите, чтобы пользователь увидел диалог сохранения файла. Однако Content-Disposition не обязательно соблюдается, поэтому пользователь все равно может получить отчет, открытый непосредственно в браузере. Не забудьте установить заголовки, прежде чем вы выводите фактический контент!

Кроме того, в зависимости от формата отчета вы можете установить Response.ContentType на что-то подходящее, например text/plain, text/csv или что-то еще. Правильные типы mime перечислены в the IANA site.

Смежные вопросы