2011-09-27 42 views
15

Có thể tải xuống tệp bằng HTTP POST không? Tôi biết cách "Nhận" (windows.location), nhưng trong trường hợp của tôi, có rất nhiều thông số cần được chuyển đến máy chủCó thể tải xuống tệp bằng HTTP POST không?

+0

Đó là lợi thế của POST, bạn có thể gửi nhiều dữ liệu (còn gọi là tải trọng). An ninh cũng có nhưng trong trường hợp của bạn gửi các tham số là yêu cầu. – EMM

Trả lời

14

Có, phần còn lại của yêu cầu POST có thể hướng trình duyệt tải xuống tập tin. Nội dung tệp sẽ được gửi dưới dạng phản hồi HTTP, giống như trong trường hợp GET.

3

Không có sự khác biệt, ngoài phương thức yêu cầu và cách bạn gửi dữ liệu đến máy chủ. Cách bạn xử lý phản hồi là như nhau bất kể bạn sử dụng GET hay POST.

+0

Xin chào Greg, bạn có thể đưa ra một ví dụ không?Cảm ơn rất nhiều – Sean

4

Trong một số ý nghĩa, mỗi HTTP GET hoặc POST là "tải xuống tệp", nhưng tốt hơn nên nghĩ đó là tải trọng thư chứ không phải là tệp. Trong hầu hết các trường hợp, tải trọng là một tài liệu HTML mà trình duyệt sẽ hiển thị dưới dạng trang web. Nhưng nếu nó không phải là một tài liệu HTML thì sao? Điều gì xảy ra nếu đó là tệp zip mà trình duyệt sẽ cung cấp cho người dùng hộp thoại "Lưu dưới dạng"? Rõ ràng, trình duyệt phải đưa ra quyết định về loại nội dung của phản hồi và xử lý chính xác.

Một trong những cách phổ biến nhất mà trình duyệt xác định loại nội dung là thông qua số HTTP header được gọi, theo đó, "Loại nội dung". Tiêu đề này lấy giá trị của một loại mime. Đây là chìa khóa cho các trình duyệt thực hiện những nội dung cụ thể như kích hoạt plugin acrobat khi phản hồi chứa tệp pdf, v.v.

Lưu ý, không phải tất cả trình duyệt 1) xác định loại nội dung theo cùng một cách và 2) phản hồi đối với loại nội dung theo cùng một cách. Đôi khi bạn phải chơi với thiết lập các tiêu đề để có được những hành vi bạn muốn từ tất cả các trình duyệt. Tất cả các công nghệ phía máy chủ đều cho phép bạn đặt tiêu đề HTTP.

12

Có vẻ như bạn muốn tạo yêu cầu POST từ Javascript. Tôi tin rằng không có cách nào để trình duyệt xử lý kết quả của một yêu cầu AJAX dưới dạng tải xuống. Ngay cả khi Content-Type được đặt thành thứ mà trình duyệt thường cung cấp dưới dạng bản tải xuống (ví dụ: "ứng dụng/octet-stream"), trình duyệt sẽ chỉ gửi dữ liệu trong đối tượng XMLHttpRequest.

Hơn nữa, như bạn có thể đã biết, không có cách nào để tạo window.open() đưa ra yêu cầu POST.

Tôi nghĩ cách tốt nhất là thực hiện yêu cầu AJAX tạo tệp trên máy chủ. Trên trình duyệt, khi yêu cầu đó hoàn tất, hãy sử dụng window.open() để tải xuống tệp đã tạo.

+0

Đây là một trong những giải pháp khả thi, cách khác là gửi biểu mẫu để truy xuất tệp thích hợp. –

11

Ý bạn là như thế này?

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 

Với mã này Server:

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

Điều này thực sự hữu ích, cảm ơn bạn. Vấn đề duy nhất là nó mở một cửa sổ mới. Điều này có thể được mở trong một iFrame không? –

+2

@Menelaos Vergis: Thêm vào trang của bạn. –

+0

@Quandry: Cảm ơn bạn rất nhiều, tôi không biết tại sao câu trả lời này không nhận được sự chú ý xứng đáng, nó hoạt động như mong đợi. –

0

tôi quản lý để giải quyết nó bằng cách sử này:

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(); 
} 

Xuân điều khiển Mã:

@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(); 
    } 
Các vấn đề liên quan