скачать файл с сервера, а затем удалить на сервере - PullRequest
1 голос
/ 02 февраля 2010

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

Мой код загрузки работает нормально, но я не знаю, когда поставить команду для удаления файла.

string filepath = restoredFilename.ToString();

            // Create New instance of FileInfo class to get the properties of the file being downloaded
            FileInfo myfile = new FileInfo(filepath);

            // Checking if file exists
            if (myfile.Exists)
            {

                // Clear the content of the response
                Response.ClearContent();

                // Add the file name and attachment, which will force the open/cancel/save dialog box to show, to the header
                Response.AddHeader("Content-Disposition", "attachment; filename=" + myfile.Name);

                //Response.AddHeader("Content-Disposition", "inline; filename=" + myfile.Name);
                // Add the file size into the response header
                Response.AddHeader("Content-Length", myfile.Length.ToString());

                // Set the ContentType
                Response.ContentType = ReturnExtension(myfile.Extension.ToLower());

                //// Write the file into the response (TransmitFile is for ASP.NET 2.0. In ASP.NET 1.1 you have to use WriteFile instead)
                Response.TransmitFile(myfile.FullName);

                // End the response
                Response.End();

            }

Теперь я знаю, что response.End () остановит все и вернет значение, так что есть ли другой способ сделать это ..

Мне нужно вызвать функцию

DeleteRestoredFileForGUI (restoredFilename);

чтобы удалить файл, но я не знаю, куда его поместить .. я пытался поместить до и после Response.End (), но он не работает ..

любая помощь приветствуется ... спасибо

Ответы [ 4 ]

5 голосов
/ 02 февраля 2010

Добавить

Response.Flush();
DeleteRestoredFileForGUI(restoredFilename);

после вызова TransmitFile () и прекращения вызова Response.End () (вам это не нужно).

Если это не сработает, тогда отключите TransmitFile () и выполните:

Stream s = myFile.OpenRead();
int bytesRead = 0;
byte[] buffer = new byte[32 * 1024] //32k buffer
while((bytesRead = s.Read(buffer, 0, buffer.Length)) > 0 &&
      Response.IsClientConnected)
{
   Response.OutputStream.Write(buffer, 0, bytesRead);
   Response.Flush();
}
2 голосов
/ 02 февраля 2010

вы не можете удалить файл сразу, так как он, возможно, еще не был загружен. со стороны сервера нет простого способа сообщить, что файл был успешно загружен. Что делать, если браузер открывает диалог открытия / сохранения? загрузка не начнется, пока диалог не будет подтвержден. (это может быть не сразу и / или диалог может быть отменен) или, что если это большой файл и соединение разорвано до полной загрузки? можно ли попытаться загрузить снова?

обычно рекомендуемый способ работы с вашей ситуацией - это удаление как отдельный процесс после периода времени, который позволяет вам (достаточно) быть уверенным, что файл больше не требуется и / или его можно воссоздать / восстановить если нужно.

В зависимости от вашей ситуации у вас может быть отдельный процесс, который периодически удаляет / обрабатывает старые файлы. или, если у вас низкий объем трафика, вы можете проверять и удалять старые файлы каждый раз, когда запрашивается новый.

идентификация старых файлов, вероятно, будет основываться на времени файла или связанном значении в базе данных darabase. В любом случае, если потенциально много файлов для обработки, вы вряд ли захотите слишком часто проверять накладные расходы, если вряд ли определите много файлов для удаления.
Кроме того, не забудьте устранить последствия того, что многие файлы не удаляются как можно скорее (действительно ли место на диске является проблемой?), против побочных эффектов, связанных с возможным их удалением, если это все еще необходимо, или с созданием побочного эффекта производительности, включив режим усердия.

0 голосов
/ 02 февраля 2010

Поскольку вы задаете имя файла в заголовке, у вас есть две опции:

  1. Считать содержимое файла в строку, удалить файл, повторить / распечатать строку как текст сообщения.

  2. Переименуйте файл в что-то вроде delete-filename.xxx, а затем используйте какой-нибудь внешний процесс (может быть, задание cron?), Который отстает и удаляет все файлы, начиная с этого префикса.

0 голосов
/ 02 февраля 2010

Общая схема, которой вы руководствуетесь, заставляет меня задуматься, а вы этим занимаетесь?

  1. Создание данных для клиента и сохранение в
  2. Передача файла с диска на клиент Удалить
  3. Файл

Если да, вы можете изменить свою систему для работы в памяти. Так как память управляется в .Net, вам не нужно выполнять эту ручную очистку, и в зависимости от размера файла это может быть также немного быстрее:

  1. Создание данных для клиента и сохранение в MemoryStream
  2. Передача потока клиенту
...