Как присвоить загруженному файлу уникальное имя

#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. Пока все хорошо, однако я сталкиваюсь с двумя проблемами:

  1. Имя файла, которое он загружает на мой компьютер DownloadFilePDF , — это имя файла HttpHandler.
  2. Файл имеет размер 0 байт, и когда я открываю файл, это неправильный тип файла.

Как я могу исправить это..

  1. Имя файла — это fileName строка запроса, которую я отправляю в HttpHandler файл.
  2. Я могу загрузить файл, который находится на самом сервере, поэтому он не равен 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. Откуда берется ваш файл?