Visoffile VS TransmitFile для больших файлов, которые необходимо удалить с сервера после передачи
-
25-09-2019 - |
Вопрос
Я должен запускать загрузки пользователя больших файлов в веб -бросете, где я создаю файл для передачи на сервере, затем удалить его сразу после этого. Я нашел достаточно примеров, чтобы увидеть, что я, вероятно, должен использовать ответ.
WriteFile синхронно, но он буферирует файл в памяти, прежде чем отправлять его пользователю. Поскольку я имею дело с очень большими файлами, это может вызвать проблемы.
Передача не буфер локально, поэтому он работает для больших файлов, но он асинхронно, поэтому я не могу удалить файл после вызова передачи TransitFile. Видимо, промывка файла, не гарантирует, что я тоже могу удалить это?
Какой лучший способ иметь дело с этим?
Также есть бинарнорит ... Могу ли я закрутить поток файлов, копируя его в сегменты?
Решение
Вот хорошее решение, которое использует TransmitFile, но позволяет сделать что-то после того, как это сделано с использованием делегата:
http://improve.dk/blog/2008/03/29/response-transmitfile-close-will-kill-your-Application
Просто замените регистрацию в конце удаления файла.
Другие советы
WriteFile синхронно, но он буферирует файл в памяти, прежде чем отправлять его пользователю. Поскольку я имею дело с очень большими файлами, это может вызвать проблемы.
Я считаю, что вы можете отключить буферизацию для записи файла, устанавливая Response.BufferOutput = false;
Как только это было установлено значение FALSE, вы должны быть в состоянии вызвать ориентировку без буферизации ...
Можете ли вы совершить файл на диск (случайное имя и т. Д.), и начать отправлять, но добавить запись в таблицу БД с временным именем, через некоторое время, когда вы определяете, есть некоторые задания очистки и удаляют Файл с диска, если он выступил.
Прививать Метод используется для загрузки небольшого файла с сервера, параметр размера должен быть между нулем и максимальным значением INT32, прежде чем передавать файл, который он буфет файл в памяти. Передача Метод используется для загрузки большого файла с сервера, и он не буксирует файл в Memory. Но когда попытается удалить файл при загрузке его, то он бросает исключение. Ниже приведен код, который удалит файл после загрузки.
FileStream fs = new FileStream(@"D:\FileDownLoad\DeskTop.zip", FileMode.OpenOrCreate);
MemoryStream ms = new MemoryStream();
fs.CopyTo(ms);
context.Response.AppendHeader("content-disposition", "attachment; filename=" + "DeskTop.zip");
context.Response.ContentType = "application/octet-stream";
context.Response.BinaryWrite(ms.ToArray());
fs.Close();
File.Delete(@"D:\FileDownLoad\DeskTop.zip");