2011-09-27 39 views
15

是否可以使用HTTP POST下載文件? 我知道「獲取」方式(windows.location),但在我的情況下,有很多參數應該傳遞給服務器是否可以使用HTTP POST下載文件?

+0

這是POST的優點,可以發送大量數據(aka payload)。安全也在那裏,但在你的情況下,發送參數是要求。 – EMM

回答

14

是的,POST請求的其餘部分可以指示瀏覽器下載文件。文件內容將作爲HTTP響應發送,與GET情況相同。

3

有沒有區別,不是請求方法等,以及如何將數據發送到服務器。無論您使用GET還是POST,處理響應的方式都是相同的。

+0

嗨,格雷格,你能舉個例子嗎?非常感謝 – Sean

4

從某種意義上說,每一個HTTP GET或POST的「下載文件」,但最好把它作爲消息有效載荷,而不是文件。在大多數情況下,有效負載是瀏覽器應呈現爲網頁的HTML文檔。但是,如果它不是一個HTML文檔呢?如果它是一個瀏覽器應該爲用戶提供「另存爲」對話框的zip文件呢?顯然,瀏覽器必須確定響應的內容類型並正確處理。

之一,一個瀏覽器確定該內容類型的最常用的方法是通過所謂的,因此HTTP header,「內容類型」。該頭文件採用MIME類型的值。這是瀏覽器做內容特定的事情的關鍵,如響應中包含PDF文件等時啓動acrobat插件等。

請注意,並非所有瀏覽器1)以相同的方式確定內容類型,並且2)反應以相同的方式轉換爲內容類型。有時你必須設置標題來玩弄所有瀏覽器所需的行爲。所有服務器端技術都允許您設置HTTP標頭。

12

看起來你想從Javascript生成POST請求。我相信沒有辦法讓瀏覽器將AJAX請求的結果視爲下載。即使Content-Type設置爲瀏覽器通常提供的下載內容(例如「application/octet-stream」),瀏覽器也只會將數據存放在XMLHttpRequest對象中。

而且,正如你可能已經知道,有沒有辦法讓window.open()發出一個POST請求。

我認爲最好的辦法是使生成的服務器上的文件的AJAX請求。在瀏覽器上,當請求完成時,使用window.open()來下載生成的文件。

+0

這是可能的解決方案之一,另一個是做表單提交檢索適當的文件。 –

11

您的意思是這樣的?

function IssuePostRequest(objData) 
    { 
     var strPageURL = "about:blank"; 
     var strAction = "@Url.Action("GetPDF", "Home")/"; 
     //var strAction = "/popups/delete.aspx"; 

     var strWindowName = "MyEvilHttpPostInAnewWindow"; // ifrmDownload 
     var iWindowWidth = 805; 
     var iWindowHeight = 625; 



     var form = document.createElement("form"); 
     form.setAttribute("id", "bla"); 
     form.setAttribute("method", "post"); 
     form.setAttribute("action", strAction); 
     form.setAttribute("target", strWindowName); 
     form.setAttribute("style", "display: none;"); 
     // setting form target to a window named 'formresult' 


     // Repeat for all data fields 
     var hiddenField = document.createElement("input"); 
     hiddenField.setAttribute("name", "data"); 
     hiddenField.setAttribute("value", objData); 
     form.appendChild(hiddenField); 
     // End Repeat for all data fields 


     document.body.appendChild(form); 



     // creating the 'formresult' window with custom features prior to submitting the form 
     //window.open(test.html, 'formresult', 'scrollbars=no,menubar=no,height=600,width=800,resizable=yes,toolbar=no,status=no'); 
     //JS_PopupCenterScreen(strPageURL, strWindowName, iWindowWidth, iWindowHeight); 
     window.open(strPageURL, strWindowName); 

     // document.forms[0].submit(); 
     //document.getElementById("xxx").click(); 
     form.submit(); 
    } // End Function IssuePostRequest 

與此服務器代碼:

public FileResult GetPDF(string data) 
    { 
     //data = @"data:image/png;base64,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"; 

     string base64Data = System.Text.RegularExpressions.Regex.Match(data, @"data:image/(?<type>.+?),(?<data>.+)").Groups["data"].Value; 
     byte[] binData = Convert.FromBase64String(base64Data); 

     byte[] ba = PdfHandler.ImageToPdf(binData); 
     //System.IO.File.WriteAllBytes(@"d:\temp\myba.pdf", ba); 

     //return System.Convert.ToBase64String(ba); 
     return File(ba, "application/pdf", "Chart.pdf"); 
    } 
+0

這是真的很有幫助,謝謝。唯一的問題是它打開一個新窗口。這可以在iFrame中打開嗎? –

+2

@Menelaos Vergis:向您的頁面添加一個​​。 –

+0

@Quandry:非常感謝,我不知道爲什麼這個答案沒有得到應有的重視,它按預期工作。 –

0

我設法以此來解決這個問題:

service.js

downloadExcel : function() { 
    var mapForm = document.createElement("form"); 
    mapForm.target ="_self"||"_blank"; 
    mapForm.id="stmtForm"; 
    mapForm.method = "POST"; 
    mapForm.action = "your_Controller_URL"; 

    var mapInput = document.createElement("input"); 
    mapInput.type = "hidden"; 
    mapInput.name = "Data"; 
    mapForm.appendChild(mapInput); 
    document.body.appendChild(mapForm); 

    mapForm.submit(); 
} 

春控制器代碼:

@Controller 

@PostMapping(value = "/your_Controller_URL") 
    public void doDownloadEmsTemplate(final HttpServletRequest request, final HttpServletResponse response) 
      throws IOException, URISyntaxException { 

     String filePath = "/location/zzzz.xls"; 
     logger.info("Excel Template File Location Path :" + filePath); 
     final int BUFFER_SIZE = 4096; 
     ServletContext context = request.getServletContext(); 
     String appPath = context.getRealPath(""); 
     String fullPath = appPath + filePath; 
     File downloadFile = new File(fullPath); 
     FileInputStream inputStream = new FileInputStream(downloadFile); 
     String mimeType = context.getMimeType(fullPath); 
     if (mimeType == null) { 
      //mimeType = "application/octet-stream"; 
      mimeType = "application/vnd.ms-excel"; 
     } 
     logger.info("MIME type: " + mimeType); 
     response.setContentType(mimeType); 
     response.setContentLength((int) downloadFile.length()); 
     String headerKey = "Content-Disposition"; 
     String headerValue = String.format("attachment; filename=\"%s\"", downloadFile.getName()); 
     logger.info("File Download Successfully : "); 
     response.setHeader(headerKey, headerValue); 
     OutputStream outStream = response.getOutputStream(); 
     byte[] buffer = new byte[BUFFER_SIZE]; 
     int bytesRead = -1; 
     while ((bytesRead = inputStream.read(buffer)) != -1) { 
      outStream.write(buffer, 0, bytesRead); 
     } 
     inputStream.close(); 
     outStream.close(); 
    } 
相關問題