2010-02-01 2 views
0

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

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

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 (restoreFilename);

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

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

+0

Будет ли работать этот код. И вместо выполнения response.end() работает response.redirect ("~/page-for-delete.aspx? File = delete.dat", false); - добавив false, вы продолжаете обрабатывать информацию на этой странице. – Kieran

+0

@Kieran, TransmitFile завершает ответ на передачу файла и Response.Redirect приведет к конфликту с ответом. –

ответ

4

Добавить

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(); 
} 
+0

response.OutputStream.Flush() не работает ... – user175084

+0

извините, попробуйте просто Response.Flush() –

+0

ok первая часть сработала ... но есть ли какие-либо проблемы при отсутствии ответа на ответ – user175084

0

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

  1. Создание данных для клиента и сохранить в
  2. Disk Transmit File Клиенту Удалить
  3. Файл

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

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

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

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

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

2

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

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

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

идентификация старых файлов, скорее всего, будет основана на времени файла или связанном значении в дарабазе. в любом случае, если есть потенциально много файлов для обработки, вы вряд ли захотите накладных расходов на проверку очень часто, если маловероятно, чтобы идентифицировать много файлов для удаления.
Кроме того, убедитесь, что последствия большого количества файлов не удаляются. КАК МОЖНО СКОРЕЕ (на самом деле проблема с диском?) Против побочных эффектов, возможно, удаляя их, когда они еще нужны или создают побочный эффект производительности, проверяя на усердие.

+0

, так что значит, больно придется протестировать его больше ... спасибо – user175084