2016-07-22 19 views
3

我正在使用ServiceStack進行簡單的Web應用程序。主要目的是讓用戶下載一個文件。使用ServiceStack HttpResult下載文件:如何爲下載的內容指定文件名?

public class FileDownloadService : Service 
{ 
public object Any() 
{ 
    string fileFullPath = "..."; 
    string mimeType = "application/pdf"; 
    FileInfo fi = new FileInfo(fileFullPath); 

    byte[] reportBytes = File.ReadAllBytes(fi.FullName); 
    result = new HttpResult(reportBytes, mimeType); 

    return result; 
} 
} 

這將打開一個對話框,在用戶的瀏覽器,用戶可以指定保存文件:我如下使用HttpResult。指定了默認名稱,即ServiceStack的restPath的名稱。

我的問題是:是否有可能爲用戶選擇保存(更改默認值)時指定自定義文件名?我試圖使用HttpResult屬性,但沒有運氣。 在此先感謝!

+0

當用戶打開「另存爲」瀏覽器的對話,他已經寫了,那就是在路由ServiceStack +文件擴展名的文件中指定的restPath一個默認的文件名(在我的情況,「downloadFile.pdf」因爲該服務通過「/ downloadFile」路由來解決)。我想更改這個默認名稱,例如將其更改爲「UserSurname_UserName.pdf」。我不知道是否有可能,如果是的話,我該如何獲得這個結果... – AdrianS

回答

3

您應該在HTTP結果上設置'Content-Disposition'標題。允許設置文件名:

public object Any() 
{ 
    string fileFullPath = "..."; 
    string mimeType = "application/pdf"; 
    FileInfo fi = new FileInfo(fileFullPath); 

    byte[] reportBytes = File.ReadAllBytes(fi.FullName); 
    result = new HttpResult(reportBytes, mimeType); 

    result.Headers.Add("Content-Disposition", "attachment;filename=YOUR_NAME_HERE.pdf;");  

    return result; 
} 
+0

謝謝!當你在寫你的時候,我正在寫自己的解決方案:我喜歡看到他們是一樣的! – AdrianS

+0

你也可以返回'新HttpResult(FI,asAttachment:真)'和ServiceStack將[填充從FileInfo的內容處置使用說明](https://github.com/ServiceStack/ServiceStack/blob/5021095b8199f45cead3cb3655b8b6e26482927d/src /ServiceStack/HttpResult.cs#L79)。 – mythz

+0

謝謝你的神話,你是對的,那是我的第一選擇。但是,當文件被放在一個網絡文件夾中時,事情發生了變化,因爲對文件的訪問被拒絕,甚至將HttpResult代插入到用於讀取文件的相同「模擬使用」中(我使用[How你在.NET中做模擬](http://stackoverflow.com/questions/125341/how-do-you-do-impersonation-in-net))。所以,我必須在生成HttpResult之前使用模擬來檢索文件內容。 – AdrianS

0

如果我正確理解你的問題,你想要的是用戶想要重命名文件。這與服務器無關。用戶必須在他使用的brwoser中進行一些更改。

如火狐 - 工具>選項>常規

然後選中「總是問我在哪裏保存文件」

瀏覽器 - 設置>下載

然後檢查「請問在哪裏保存每個文件「

之前然後,它會打開文件瀏覽器在哪裏保存,你可能會改變你的文件名什麼都你想

2

我找到了解決方案。我被HttpResult的只讀屬性所欺騙。 爲了改變默認的文件名,我發現我必須添加下面的行,即對待內容處置:

result.Headers[HttpHeaders.ContentDisposition] = "attachment; filename=\"UserSurname_UserName.pdf\""; 

謝謝大家的時間!

+0

你也可以直接返回'new HttpResult(fi,asAttachment:true)',它會使用'FileInfo'自動添加信息。 – mythz

相關問題