2012-07-04 9 views
3

Передаваемые параметры:TransmitFile отсутствует один байт от конца файла

`C:\Licenses\testfolder\PERSONAL-Wednesday 04 July-0405.txt`,`c2license.txt` 

И функция:

/// <summary> 
/// Starts serving the download 
/// </summary> 
public static void InitStoreDownload(string filePath, string serveFileName) 
{ 
    // Get size of file 
    var f = new FileInfo(filePath); 

    var fileSize = f.Length; 
    var extension = f.Extension; 

    var context = HttpContext.Current; 

    context.Response.Clear(); 
    context.Response.Buffer = false; 

    // Correct mime type 
    if (extension.Equals(".zip", StringComparison.CurrentCultureIgnoreCase)) 
     context.Response.ContentType = "application/octet-stream"; 
    else if (extension.Equals(".txt", StringComparison.CurrentCultureIgnoreCase)) 
    { 
     context.Response.ContentType = "text/plain"; 
    } 

    context.Response.AddHeader("Content-Disposition", "attachment; filename=" + serveFileName); 
    context.Response.AddHeader("Content-Length", fileSize.ToString()); 
    context.Response.TransmitFile(filePath); 
    context.Response.Close(); 

    context.Response.End(); 
} 

C:\Licenses\testfolder\PERSONAL-Wednesday 04 July-0405.txt файл на сервере длиной 475 байт.

Файл, загруженный при использовании этого скрипта, составляет 474 байта, при этом отсутствует один байт с конца файла. (Последний байт является полной остановкой, присутствующей в файле на сервере, но не присутствующим при загрузке через эту функцию). Это приводит к тому, что файл становится недействительным.

Мы почесываем головы, пытаясь понять, почему байт отсутствует, может ли кто-нибудь помочь?

+0

Что произойдет, если вы не указали явный заголовок 'Content-Length'? – user1429080

ответ

3

Попробуйте использовать

Response.TransmitFile(filePath); 
HttpContext.Current.ApplicationInstance.CompleteRequest(); 

вместо

Response.Close(); 
Response.End(); 

Или, как другой упоминалось:

вызов Flush() перед тем Close()

Response.TransmitFile(filePath); 
Response.Flush(); 
Response.Close(); 
Response.End(); 

или опустить вызов Close() и позвонить по номеру End(), поскольку он включает в себя сброс ответа.

Response.TransmitFile(filePath); 
Response.End(); 

There's thread о Response.End(), может быть, она содержит полезную информацию для Вас.

+0

Все еще служит 474 байта, а не 475. –

+0

@TomGullen - попробуйте 'Response.Flush()' перед тем, как вы вызовете 'Close()' и 'End()' – adatapost

+0

'Flush' и' CompleteRequest', похоже, являются выигрышной комбо, Спасибо, парни! Кто-нибудь знает, почему это включает последний байт, когда до этого нет? –