#c# #asp.net
#c# #asp.net
Вопрос:
У меня есть приложение на C #, которое сохраняет заполненный PDF-файл в папке внутри моего сайта. Во время операции я сохраняю две переменные сеанса в filename и filepath на сервере:
string strFileName = "completed_pdf_" k ".pdf"; //k is a variable in a function for the name
Session["fileName"] = strFileName;
MessageBox.Show(Session["fileName"].toString()); //displays: completed_pdf_{name}.pdf
newFileServer = System.Environment.MachineName @"/PDFGenerate/completed_pdf_" k ".pdf";
strFullPath = Path.GetFullPath("//" newFileServer);
List<System.Web.UI.WebControls.ListItem> files = new List<System.Web.UI.WebControls.ListItem>();
files.Add(new System.Web.UI.WebControls.ListItem(strFullPath, strFullPath));
strN = files[0].ToString();
Session["pathName"] = strN;
MessageBox.Show(Session["pathName"].toString()); //displays: \myserverpdfgencompleted_pdf_{name}.pdf
У меня есть GridView
, который отображает LinkButton
:
<asp:LinkButton ID="lnkDownload" Text = "Download" runat="server" OnClick = "DownloadFile" />
Функция для LinkButton
:
protected void DownloadFile(object sender, EventArgs e)
{
//MessageBox.Show(Session["pathName"].ToString()); //displays correctly
//MessageBox.Show(Session["fileName"].ToString()); //displays correctly
Response.Redirect("DownloadFilePDF.ashx?myvar=" Session["pathName"].ToString() "amp;myvar2=" Session["fileName"].ToString());
}
Мой HTTPHandler
код таков:
<%@ WebHandler Language="C#" Class="DownloadFilePDF" %>
using System;
using System.Web;
public class DownloadFilePDF : IHttpHandler {
public void ProcessRequest (HttpContext context) {
System.Web.HttpRequest request = System.Web.HttpContext.Current.Request;
string strSessVar = request.QueryString["pathName"];
System.Web.HttpRequest request2 = System.Web.HttpContext.Current.Request;
string strSessVar2 = request.QueryString["fileName"];
System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
response.ClearContent();
response.Clear();
response.ContentType = "application/pdf";
response.AddHeader("Content-Disposition", "attachment; filename=" strSessVar ";");
response.End();
}
public bool IsReusable {
get {
return false;
}
}
}
Когда я запускаю свой веб-сайт на самом сервере, он просит меня загрузить файл ASHX, но если я запускаю свой веб-сайт со своего локального компьютера, который находится в той же сети, что и сервер, мне предлагается загрузить файл PDF. Пока все хорошо, однако я сталкиваюсь с двумя проблемами:
- Имя файла, которое он загружает на мой компьютер
DownloadFilePDF
, — это имя файла HttpHandler. - Файл имеет размер 0 байт, и когда я открываю файл, это неправильный тип файла.
Как я могу исправить это..
- Имя файла — это
fileName
строка запроса, которую я отправляю вHttpHandler
файл. - Я могу загрузить файл, который находится на самом сервере, поэтому он не равен 0 байтам.
Ответ №1:
Как присвоить загруженному файлу уникальное имя
Вы можете использовать несколько параметров, таких как Guid
класс, DateTime.Now
метод и так далее, Чтобы иметь уникальный идентификатор для загруженного файла, например, использовать Guid.NewGuid
:
response.AddHeader("Content-Disposition", "attachment; filename=" string.format(strSessVar {0}, Gui.NewGuid()) ";");
Обновить:
Используя следующий код, вы ничего не делаете, кроме отправки пустого файла:
System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
response.ClearContent();
response.Clear();
response.ContentType = "application/pdf";
response.AddHeader("Content-Disposition", "attachment; filename=" strSessVar ";");
response.End();
Чтобы решить эту проблему, jst передает содержимое вашего файла в ответ, посмотрите:
response.BinaryWrite(GetFileContentsFromSomewhere());
Комментарии:
1. Ваш пример — это то, что у меня есть прямо сейчас… Я бы хотел, чтобы загруженный файл сохранял то же имя файла, что и на сервере (если это возможно).
2. @SearchForKnowledge Вы просто не отправляете никаких файлов со своего сервера! Посмотрите на мое обновление.
3. На самом деле файлы сохраняются на диске C: сервера, которым я поделился со всеми. Итак, на сервере файл находится по адресу C:PDFFolder {filename}.pdf и извне сервера я бы получил к нему доступ как \myserverPDFFolder {filename}.pdf. Как я могу исправить свой код, чтобы использовать это?
Ответ №2:
Здесь что-то не так. Я не вижу, чтобы какой-либо контент передавался клиенту. Вам нужно предоставить содержимое в ответе, например, так:
System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
response.ClearContent();
response.Clear();
response.ContentType = "application/pdf";
response.AddHeader("Content-Disposition", "attachment; filename=" strSessVar ";");
response.BinaryWrite(GetFileContentsFromSomewhere()); //<--- this baby does all the magic
response.End();
Реализация GetFileContentsFromSomewhere() зависит от того, откуда вы собираетесь получить файл. Если это просто статический файл на вашем веб-сервере, вы могли бы использовать что-то вроде этого:
response.WriteFile(localPathOfFile);
или
response.WriteFile(Server.MapPath(urlOfFile));
Комментарии:
1. Что должно быть внутри ребенка? :/
2. Откуда берется ваш файл?