使用 JavaScript 的 HTTP POST 的可下载数据 link

Downloadable data link for HTTP POST using JavaScript

我有一个使用图像的 HTTP POST REST 端点和 returns 一个包含图像像素数据的 HTML 文档。 HTTP 响应包括 header Content-Disposition: 附件; filename=Pixels.html 这样浏览器会提示下载。

我想要一个 HTML/JavaScript(不是 jQuery)应用

  1. 允许我浏览和选择图像(例如,<input id="fid" name="fid" type="file" />
  2. 单击 link post 图像数据到端点,让我将 HTML 内容下载到磁盘(例如 <p onclick="javascript: getPixels()">Get Pixels</p>)。

我该怎么做?我尝试了以下代码:

  function getPixels() {
     var input = document.getElementById("fid");
     if (input.files && input.files[0]) {
        if (typeof (FileReader) != "undefined") {
           var reader = new FileReader();
           reader.onload = function (e) {
              var imgData = e.target.result;
              var postUrl = "./GetPixelsService.svc/image";
              var xhr = new XMLHttpRequest();
              xhr.open("POST", postUrl);
              xhr.setRequestHeader("Content-Type", "image/png");
              //xhr.onreadystatechange = function () {
              //   if (xhr.readyState === 4) {
              //      var res_display = document.getElementById("results");
              //      res_display.srcdoc = xhr.responseText;
              //   }
              //}
              xhr.send(imgData);
           };
           reader.readAsArrayBuffer(input.files[0]);
        }
     }
  }

以下是调用上述函数的HTML宣传语。

  <p>
     Upload the image here:
  </p>
  <input id="fid" name="fid" type="file" />
  <!--<button type="submit" onclick="javascript: getPixels()">Get Pixels</button>-->
  <p onclick="javascript: getPixels()">Get Pixels</p>
  <p />
  <hr />
  <p>
     <img id="img2check" src="" alt="" />
  </p>
  <p />
  <iframe id="results" style="width: 100%; border: 0; height: 400px;" src="javascript:;">
     Your browser does not support iframes.
  </iframe>

我可以选择响应并将其显示在 iframe 中,但无法让浏览器下载内容。

感谢您的帮助。我查看了 Whosebug 上的相关问题,但 none 到目前为止有所帮助。

提前致谢。

您不能强制客户端浏览器提示带有 XMLHttpRequest 的保存对话框。

您可以做的是:

1: 检查我对另一个类似问题的回答:How to get pdf file via javascript ajax

2: 在服务器上生成文件或创建一个 get 类型的请求处理程序,并为它提供 link 和 download 属性。 http://www.w3schools.com/TAgs/att_a_download.asp

3: 使用像 Downloadify 这样的第三方应用程序:https://github.com/dcneiner/Downloadify

4: 还有另一种方法使用 Blob,我还没有尝试过,在这里:Browser/HTML Force download of image from src="data:image/jpeg;base64..."。 post 是关于 base64 图像的,但我认为值得尝试使用 html 文件。

感谢er-han,下面的代码实现了目标。

  <!DOCTYPE html>
  <html>
  <head>
     <meta charset="utf-8" />
     <title></title>
  </head>
  <body>
     <script type="text/javascript">
        function getPixels() {
           showImage();
           var input = document.getElementById("fid");
           if (input.files && input.files[0]) {
              if (typeof (FileReader) != "undefined") {
                 var reader = new FileReader();
                 reader.onload = function (e) {
                    var imgData = e.target.result;
                    var postUrl = "./SimpleService.svc/image";
                    var xhr = new XMLHttpRequest();
                    xhr.open("POST", postUrl);
                    xhr.setRequestHeader("Content-Type", "image/png");
                    xhr.onreadystatechange = function () {
                       if (xhr.readyState === 4) {
                          var res_url = URL.createObjectURL(new Blob([xhr.responseText]));
                          var lnk = document.getElementById("dlink");
                          lnk.href = res_url;
                          lnk.style.display = "block";
                       }
                    }
                    xhr.send(imgData);
                 };
                 reader.readAsArrayBuffer(input.files[0]);
              }
           }
        }

        function showImage() {
           var input = document.getElementById("fid");
           if (input.files && input.files[0]) {
              if (typeof (FileReader) != "undefined") {
                 var reader = new FileReader();
                 reader.onload = function (e) {
                    var img_display = document.getElementById("img2check");
                    img_display.src = e.target.result;
                 };
                 reader.readAsDataURL(input.files[0]);
              }
           }
        }
     </script>

     <p>
        Upload the image here:
     </p>
     <input id="fid" name="fid" type="file" />
     <p/>
     <button type="submit" onclick="javascript: getPixels()">Upload</button>
     <p />
     <hr />
     <p>
        <img id="img2check" src="" alt="" />
     </p>
     <p />
     <p>
        <a id="dlink" href="#" download="Data.html" style="display: none;">Download data</a>
     </p>
  </body>
  </html>