2011-05-06 75 views
5

我正在使用處理程序(.ashx)來提供某些文件。我有一個存放電子書的文件夾。我在書PK他們的名字,並且每本書可以有幾個不同的格式:如何發送客戶端的多個文件以下載

211.html 
211.pdf 
211.prc 

下面的測試代碼成功下載一本書。

context.Response.ContentType = "application/octet-stream"; 
context.Response.AppendHeader("Content-Disposition", "attachment;filename=myfile.pdf"); 
context.Response.TransmitFile(context.Server.MapPath("~/Media/eBooks/212.pdf")); 

我該如何爲客戶提供三種不同的格式? (客戶端現有的組織不是一個文件夾中)

我試圖做這樣的事情:

DirectoryInfo bookDir = new DirectoryInfo(context.Server.MapPath("~/Media/eBooks")); 
FileInfo[] f = bookDir.GetFiles(); 

foreach (var n in f) 
{ 
    context.Response.AppendHeader("Content-Disposition", "attachment;filename=myfile.pdf"); 
    context.Response.TransmitFile(context.Server.MapPath("~/Media/eBooks/212.pdf")); 
} 

但是它下載一個文件,沒有文件擴展名。

回答

8

您可以在一個響應中發送多個文件的唯一方法是將它們放入歸檔文件包中,例如,一個.zip文件。 至少可以用代碼完成,使用各種工具(IIRC現在主要.NET框架內部有一個zip包裝器,否則,SharpZipLib將很好地完成這項工作)。

1

要發送多個文件被下載,你應該使用sharpziplib或其他文件壓縮和解壓縮工具他們,文件應該壓縮,然後下載鏈接可以被髮送到客戶端,一次下載。下面的代碼使用ICSharpCode.SharpZipLib.dll庫。 你可以調用這個類並傳遞你想要壓縮的文件。

public string Makezipfile(string[] files) 
    { 

    string[] filenames = new string[files.Length]; 


     for (int i = 0; i < files.Length; i++) 
      filenames[i] = HttpContext.Current.Request.PhysicalApplicationPath + files[i].Replace(HttpContext.Current.Request.UrlReferrer.ToString(), ""); 
    string DirectoryName = filenames[0].Remove(filenames[0].LastIndexOf('/')); 
    DirectoryName = DirectoryName.Substring(DirectoryName.LastIndexOf('/') + 1).Replace("\\", ""); 

    try 
    { 

     string newFile = HttpContext.Current.Request.PhysicalApplicationPath + "your image directory\\" + DirectoryName + ".zip"; 
     if (File.Exists(newFile)) 
      File.Delete(newFile); 

     using (ZipFile zip = new ZipFile()) 
     { 

      foreach (string file in filenames) 
      { 

       string newfileName = file.Replace("\\'", "'"); 
       zip.CompressionLevel = 0; 
       zip.AddFile(newfileName, ""); 
      } 

      zip.Save(newFile); 
     } 
    } 
    catch (Exception ex) 
    { 
     //Console.WriteLine("Exception during processing {0}", ex); 
     Response.Write(ex); 
     // No need to rethrow the exception as for our purposes its handled. 
    } 
    string a; 
    a = "your images/" + DirectoryName + ".zip"; 
    return a; 

} 
1

我承認這裏所說的好郵編解決方案,但使用JavaScript/XHR,每次請求不同的文件格式,或者你能做出3個電話到處理程序?

誠然,你被瀏覽器所支持的併發請求的數量限制,但我相信,瀏覽器會排隊超過限制的請求。

好處是用戶不需要處理一個zip文件,這可能會讓他們感到困惑。相反,他們應該得到3個單獨的下載

+0

我同意但我認爲如果他可以爲每個zip文件下載創建一個進程ID,那麼他可以跟蹤每個下載並且該進程將在後臺運行。如果用戶啓動一個zip文件進行下載,那麼用戶可以發送一個進程ID和文件進行下載,同時如果他啓動另一個zip文件進行下載,則會生成第二個進程ID併發送到後臺類。當進程在後臺完成時,它將返回要下載的進程ID和zipfiles路徑。 – safi 2011-05-06 10:02:32