Сохраните сгенерированный файл на сервере, а не загружайте его пользователю в C # - PullRequest
0 голосов
/ 23 мая 2018

У меня есть следующий метод, который преобразует HTML в документ Word и отправляет его в виде загрузки пользователю.

public static void HtmlToWordDownload(string HTML, string FileName, string title = "", bool border = false)
{
    lock (LockMulti)
    {
        string strBody = string.Empty;
        strBody = @"<html xmlns:o='urn:schemas-microsoft-com:office:office' " +
        "xmlns:w='urn:schemas-microsoft-com:office:word'" +
        "xmlns='http://www.w3.org/TR/REC-html40'>" +
        "<head><title>:" + title + "</title>" +
         "<!--[if gte mso 9]><xml><w:WordDocument><w:View>Print</w:View><w:Zoom>100</w:Zoom>" +
         "<w:DoNotOptimizeForBrowser/></w:WordDocument></xml><![endif]-->" +
         "<style> @page Section1 {size:8.27in 11.69in; mso-first-footer:ff1; mso-footer: f1; mso-header: h1; " +
         ((border == true) ? "border:solid navy 2.25pt; padding:24.0pt 24.0pt 24.0pt 24.0pt; " : "") +
         "margin:0.6in 0.6in 0.6in 0.6in ; mso-header-margin:.1in; " +
         "mso-footer-margin:.1in; mso-paper-source:0;} " +
         "div.Section1 {page:Section1;} p.MsoFooter, li.MsoFooter, " +
         "div.MsoFooter{margin:0in; margin-bottom:.0001pt; " +
         "mso-pagination:widow-orphan; tab-stops:center 3.0in right 6.0in; " +
         "font-size:12.0pt; font-family:'Arial';} " +
         "p.MsoHeader, li.MsoHeader, div.MsoHeader {margin:0in; " +
         "margin-bottom:.0001pt; mso-pagination:widow-orphan; tab-stops:center " +
         "3.0in right 6.0in; font-size:12.0pt; font-family:'Arial';}--></style></head> ";
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.Charset = "";
        HttpContext.Current.Response.ContentType = "application/vnd.ms-word";
        HttpContext.Current.Response.AddHeader("Content-Disposition", "inline;filename=" + FileName + ".doc");
        StringBuilder htmlCode = new StringBuilder();
        htmlCode.Append(strBody);
        htmlCode.Append("<body><div class=Section1>");
        htmlCode.Append(HTML);
        htmlCode.Append("</div></body></html>");
        HttpContext.Current.Response.Write(htmlCode.ToString());
        HttpContext.Current.Response.End();
        HttpContext.Current.Response.Flush();
    }
}

Теперь я не хочу передавать его в качестве загрузки непосредственно пользователю, яхочу сначала сохранить его в локальной папке на моем сервере, а затем дать его в качестве загрузки.Как мне это сделать?

1 Ответ

0 голосов
/ 23 мая 2018

Вы можете попытаться обработать созданный вами файл следующим образом: htmlCode.ToString ():

Response.Clear(); 
Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name); 
Response.AddHeader("Content-Length", file.Length.ToString()); 
Response.ContentType = "application/octet-stream"; 
Response.WriteFile(file.FullName); 
Response.End();

Другой метод - сохранить файл и прочитать его какмассив байтов и обслуживайте его так:

byte[] Content= File.ReadAllBytes(FilePath); //missing ;
Response.ContentType = "text/csv";
Response.AddHeader("content-disposition", "attachment; filename=" + fileName + ".csv");
Response.BufferOutput = true;
Response.OutputStream.Write(Content, 0, Content.Length);
Response.End();

или

string filename="Connectivity.doc";

if (filename != "")

{

          string path = Server.MapPath(filename);

          System.IO.FileInfo file = new System.IO.FileInfo(path);

          if (file.Exists)

          {

                   Response.Clear();

                   Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);

                   Response.AddHeader("Content-Length", file.Length.ToString());

                   Response.ContentType = "application/octet-stream";

                   Response.WriteFile(file.FullName);

                   Response.End();

          }

          else

          {

                   Response.Write("This file does not exist.");

          }

}

В противном случае

После сохранения файла Word / PDF вНа сервере по некоторому временному пути вы можете использовать HTTP-обработчик (.ashx) для загрузки файла, например:

ExamplePage.ashx:

public class DownloadFile : IHttpHandler 
{
    public void ProcessRequest(HttpContext context)
    {   
        System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
        response.ClearContent();
        response.Clear();
        response.ContentType = "text/plain";
        response.AddHeader("Content-Disposition", 
                           "attachment; filename=" + fileName + ";");
        response.TransmitFile(Server.MapPath("FileDownload.csv"));
        response.Flush();    
        response.End();
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

Затем вы можете вызвать обработчик HTTPиз обработчика событий нажатия кнопки, например:

Разметка:

<asp:Button ID="btnDownload" runat="server" Text="Download File" 
            OnClick="btnDownload_Click"/>

Код сзади:

protected void btnDownload_Click(object sender, EventArgs e)
{
    Response.Redirect("PathToHttpHandler/DownloadFile.ashx");
}

Передача параметра в обработчик HTTP:

Вы можете просто добавить переменную строки запроса в Response.Redirect (), например:

Response.Redirect("PathToHttpHandler/DownloadFile.ashx?yourVariable=yourValue");

Затем в фактическом коде обработчика вы можете использовать объект Request в HttpContext, чтобы получитьЗначение переменной строки запроса, например:

System.Web.HttpRequest request = System.Web.HttpContext.Current.Request;
string yourVariableValue = request.QueryString["yourVariable"];

// Use the yourVariableValue here

Примечание. Обычно имя файла передается в качестве параметра строки запроса.предложите пользователю, что это за файл на самом деле, и в этом случае они могут переопределить это имя с помощью кнопки Сохранить как ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...