简体   繁体   English

是否可以使用HTTP POST下载文件?

[英]Is it possible to download a file with HTTP POST?

Is it possible to download a file with HTTP POST? 是否可以使用HTTP POST下载文件? I know the "Get" way(windows.location), but in my case, there are a lot of param that should be passed to server 我知道“获取”方式(windows.location),但在我的情况下,有很多param应该传递给服务器

Yes, the rest of a POST request can direct a browser to download a file. 是的,POST请求的其余部分可以指示浏览器下载文件。 The file contents would be sent as the HTTP response, same as in the GET case. 文件内容将作为HTTP响应发送,与GET情况相同。

You mean like this ? 你的意思是这样的?

    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

With this Server code: 使用此服务器代码:

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

Looks like you'd like to generate the POST request from Javascript. 看起来你想从Javascript生成POST请求。 I believe there is no way to get the browser to treat the result of an AJAX request as a download. 我相信没有办法让浏览器将AJAX请求的结果视为下载。 Even if the Content-Type is set to something that browsers would normally offer as a download (eg to "application/octet-stream"), the browser will only deposit the data in the XMLHttpRequest object. 即使将Content-Type设置为浏览器通常作为下载提供的内容(例如,“application / octet-stream”),浏览器也只将数据存放在XMLHttpRequest对象中。

Furthermore, as you probably already know, there is no way to make window.open() issue a POST request. 此外,正如您可能已经知道的那样,无法使window.open()发出POST请求。

I think the best way is to make an AJAX request which generates a file on the server. 我认为最好的方法是发出一个AJAX请求,在服务器上生成一个文件。 On the browser, when that request completes, use window.open() to download the generated file. 在浏览器上,当该请求完成时,使用window.open()下载生成的文件。

In some sense, every HTTP GET or POST is "downloading a file", but it's better to think of it as the message payload rather than a file. 在某种意义上,每个HTTP GET或POST都是“下载文件”,但最好将其视为消息有效负载而不是文件。 In most cases, the payload is an HTML document that the browser should render as a web page. 在大多数情况下,有效负载是HTML文档,浏览器应将其呈现为网页。 But what if it's not an HTML document? 但是,如果它不是HTML文档呢? What if it's a zip file for which the browser should offer the user a "Save as" dialog? 如果它是一个zip文件,浏览器应该为用户提供“另存为”对话框怎么办? Obviously, the browser must make a determination about the content type of the response and handle it correctly. 显然,浏览器必须确定响应的内容类型并正确处理它。

One of the most common ways that a browser determines the content type is through a HTTP header called, accordingly, "Content-Type". 浏览器确定内容类型的最常见方式之一是通过称为“内容类型”的HTTP标头 This header takes the value of a mime-type. 此标头采用mime类型的值。 This is the key to browsers doing content specific things like firing up an acrobat plugin when the response contains a pdf file, etc. 这是浏览器执行内容特定事务的关键,例如当响应包含pdf文件时启动acrobat插件等。

Note, not all browsers 1) determine the content type in the same way, and 2) react to the content type in the same way. 注意,并非所有浏览器都以相同的方式确定内容类型,并且2)以相同的方式对内容类型做出反应。 Sometimes you have to toy with setting the headers to get the behaviors you want from all the browsers. 有时您必须设置标题以获得所有浏览器所需的行为。 All server side technologies allow you to set HTTP headers. 所有服务器端技术都允许您设置HTTP标头。

There's no difference, other than the request method and how you send data to the server. 除了请求方法以及如何将数据发送到服务器之外,没有区别。 The way you process the response is the same regardless of whether you use GET or POST. 无论您使用GET还是POST,处理响应的方式都是相同的。

I managed to solve it using this: 我设法用这个来解决它:

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

Spring Controller Code : 弹簧控制器代码:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM