Загрузка файла ASP.NET с сервера
После того, как пользователь нажмет кнопку, я хочу, чтобы файл был загружен. Я пробовал следующее, которое, похоже, работает, но не исключает исключения (ThreadAbort), которое неприемлемо.
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();
Ответы
Ответ 1
Вы можете использовать обработчик HTTP (.ashx) для загрузки файла, например:
DownloadFile.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"/>
Code-Behind:
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
Примечание - обычно передается имя файла как параметр строки запроса, чтобы предлагать пользователю, что такое файл на самом деле, и в этом случае они могут переопределить это имя с помощью Save As...
Ответ 2
Попробуйте этот набор кода для загрузки CSV файла с сервера.
byte[] Content= File.ReadAllBytes(FilePath)
Response.ContentType = "text/csv";
Response.AddHeader("content-disposition", "attachment; filename=" + fileName + ".csv");
Response.BufferOutput = true;
Response.OutputStream.Write(Content, 0, Content.Length);
Response.End();
Ответ 3
Внесение изменений, как показано ниже, и перераспределение по типу содержимого сервера как
Response.ContentType = "application/octet-stream";
Это сработало для меня.
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();
Ответ 4
В дополнение к решению Карла Андерсона вы можете поместить свои параметры в информацию о сеансе, а затем очистить их после response.TransmitFile(Server.MapPath( Session(currentSessionItemName)));
.
Подробнее о сеансах см. на странице MSDN HttpSessionState.Add Method (String, Object).
Ответ 5
protected void DescargarArchivo(string strRuta, string strFile)
{
FileInfo ObjArchivo = new System.IO.FileInfo(strRuta);
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + strFile);
Response.AddHeader("Content-Length", ObjArchivo.Length.ToString());
Response.ContentType = "application/pdf";
Response.WriteFile(ObjArchivo.FullName);
Response.End();
}
Ответ 6
Простое решение для загрузки файла с сервера:
protected void btnDownload_Click(object sender, EventArgs e)
{
string FileName = "Durgesh.jpg"; // It a file name displayed on downloaded file on client side.
System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
response.ClearContent();
response.Clear();
response.ContentType = "image/jpeg";
response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + ";");
response.TransmitFile(Server.MapPath("~/File/001.jpg"));
response.Flush();
response.End();
}