У меня есть веб-приложение ASP.NET (использующее WebForms), и я использую Uploadify для загрузки больших файлов. Это делается путем публикации файла в HttpHandler.
Пример кода (упрощенный для демонстрационных целей):
$(".uploadify").uploadify({
'uploader': '/uploadify/uploadify.swf',
'script': 'SaveUploadedFile.ashx',
'cancelImg': '/uploadify/cancel.png',
'queueID': 'fileQueue',
'auto': true,
'multi': false,
'method': 'post',
onSelect: function(e, queueId, file) {
alert(file.name + " selected");
},
onComplete: function(e, queueId, file, response, data) {
alert("complete: " + response);
},
onCancel: function(e, queueId, file, data) {
alert("cancel");
}
});
HttpHandler, который получает файл, довольно прост:
public void ProcessRequest(HttpContext context)
{
Debug.WriteLine("Save file");
if (context.Request.Files.Count == 0)
throw new SystemException("No files uploaded");
// Get the file
HttpPostedFile file = context.Request.Files.Get(0);
Debug.WriteLine("Got file: " + file.FileName + ", Length: " + file.ContentLength);
// Save it
string guid = Guid.NewGuid().ToString();
string path = Path.Combine(Path.GetTempPath(), guid + ".tmp");
file.SaveAs(path);
Debug.WriteLine("Saved to path: " + path);
// Update response and return guid
context.Response.StatusCode = 200;
context.Response.Write(guid);
Debug.WriteLine("All Done");
}
Проблема заключается в том, что отображаемый индикатор выполнения на самом деле не отражает ход загрузки и показывает, что загрузка завершена задолго до фактической загрузки файла. Таким образом, пользовательский интерфейс фактически выглядит так, как будто он ничего не делает, в то время как индикатор выполнения остается на 100%, пока файл не будет завершен.
В некоторых случаях загрузка просто завершается сбоем после достижения 100%, при этом событие OnComplete никогда не запускается, почти так же, как ответ от HttpHandler теряется при передаче, даже если файл сохраняется.
Я пробовал как Flajaxian, так и SWFUpload, и столкнулись с аналогичными проблемами, когда индикатор выполнения полностью не синхронизировался с фактическим ходом загрузки, указывая на завершение задолго до фактического завершения загрузки.
Эта проблема не проявляется при локальном тестировании или с небольшими файлами (обычно менее нескольких мегабайт), поскольку они имеют тенденцию загружаться довольно быстро, и задержка между загрузкой файла и завершением индикатора выполнения минимальна или отсутствует.
Есть ли способ использовать решение для загрузки Flash (например, Uploadify) с веб-приложением ASP.NET, чтобы индикатор выполнения лучше отображал фактический ход загрузки?
Обновление: в конце концов я отказался от попыток использовать загрузчик на основе флэш-памяти, так как он казался слишком неудобным, особенно индикатор выполнения, который вообще не отображал фактический ход загрузки. Заменил его на Brettle NeatUpload, который работает намного лучше.