2017-04-27 201 views
0

有問題的PowerPoint文件大小爲18mb。點擊一個按鈕後,在一個控制器下面的GET方法被稱爲:從服務器下載.pptx文件到客戶端 - ASP.NET

[Route("api/download/GetFile")] 
    [HttpGet] 

    public HttpResponseMessage GetFile() 
    { 
     HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); 

     try 
     { 
      var localFilePath = HttpRuntime.AppDomainAppPath + "content\\files\\file.pptx"; 
      var stream = File.OpenRead(localFilePath); 
      stream.Position = 0; 
      stream.Flush(); 

      if (!System.IO.File.Exists(localFilePath)) 
      { 
       result = Request.CreateResponse(HttpStatusCode.Gone); 
      } 
      else 
      { 
       byte[] buffer = new byte[(int)stream.Length]; 

       result.Content = new ByteArrayContent(buffer); 

       result.Content.Headers.Add("Content-Type", "application/pptx"); 
       result.Content.Headers.Add("x-filename", "file.pptx"); 
       result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); 
       result.Content.Headers.Add("Content-Length", stream.Length.ToString()); 
       result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.presentationml.presentation"); 

      } 

      return result; 
     } 
     catch (Exception e) 
     { 
      return Request.CreateResponse(HttpStatusCode.BadRequest); 
     } 
    } 

文件下載罰款通過瀏覽器的下載文件夾和大小是完全一樣被稱爲原始文件在服務器上下載。然而,試圖打開它的時候:

「PowerPoint發現在file.pptx不可讀的內容要 恢復此演示文稿的內容,如果您信任的 此演示文稿源,單擊是辦?」。

單擊「是」只會使PowerPoint加載一段時間,然後返回錯誤消息「訪問此文件時出現問題」。

我懷疑問題出在這個「x文件名」內,但將此值更改爲其他內容最終導致瀏覽器僅用幾KB下載bin文件。我也嘗試將ContentType和MediaTypeHeaderValue更改爲許多不同的東西(application/pptx,application/x-mspowerpoint等),但是沒有什麼關鍵技巧。此外,我也嘗試這樣分配內容:

 result.Content = new StreamContent(new FileStream(localFilePath, FileMode.Open, FileAccess.Read)); 

這也不起作用。

任何幫助表示讚賞。

編輯:

正如漢斯合成聚合物膜指出,看來我是沒有正確複製字節。然而,在做下面當試圖打開PowerPoint文件,但該文件現在是33MB的大小仍然會產生相同的錯誤消息:

   MemoryStream memoryStream = new MemoryStream(); 
       stream.CopyTo(memoryStream); 

       byte[] buffer = memoryStream.ToArray(); // stream.CopyTo// new byte[(int)stream.Length]; 

       result.Content = new ByteArrayContent(buffer); 

,當我以錯誤的方式下載的文件有複製的字節數怎麼來與原始文件相同的字節數量,但現在它有33 MB?

+0

它不會幫你,但首先你打開文件,然後*檢查它是否存在? –

+0

for mimetypes,請參閱http://filext.com/faq/office_mime_types.php –

+0

建議:Windows操作系統中的最大路徑長度爲255個字符。看看你是否有 - 我有這個問題,文件的路徑是超過255個字符。它下載了文件,在那裏,但無法打開。 –

回答

1
  byte[] buffer = new byte[(int)stream.Length]; 
      result.Content = new ByteArrayContent(buffer); 

這意味着您有一個正確大小的緩衝區,但爲空。您仍然需要從該流中填充它。

+0

感謝您的回答!我試圖填充緩衝區(希望現在有一個好的方法),但問題仍然存在。看我的編輯。 –

相關問題