当前位置: 首页 > 面试题库 >

通过jQuery.Ajax下载文件

申屠鹏
2023-03-14
问题内容

我在服务器端有一个Struts2操作,用于文件下载。

<action name="download" class="com.xxx.DownAction">
    <result name="success" type="stream">
        <param name="contentType">text/plain</param>
        <param name="inputName">imageStream</param>
        <param name="contentDisposition">attachment;filename={fileName}</param>
        <param name="bufferSize">1024</param>
    </result>
</action>

但是,当我使用jQuery调用操作时:

$.post(
  "/download.action",{
    para1:value1,
    para2:value2
    ....
  },function(data){
      console.info(data);
   }
);

在Firebug中,我看到数据是通过 Binary流 检索的。我想知道如何打开 文件下载窗口 ,用户可以用它在本地保存文件吗?


问题答案:

这是我现在建议的一些注意事项:

  • 需要相对较新的浏览器
  • 如果预期文件 很大,则 您可能应该执行与原始方法(iframe和cookie)类似的操作,因为以下某些操作可能会消耗系统内存,至少与正在下载的文件和/或其他有趣的CPU一样大。副作用。

    fetch('https://jsonplaceholder.typicode.com/todos/1’)

    .then(resp => resp.blob())

    .then(blob => {

    const url = window.URL.createObjectURL(blob);
    
    const a = document.createElement('a');
    
    a.style.display = 'none';
    
    a.href = url;
    
    // the filename you want
    
    a.download = 'todo-1.json';
    
    document.body.appendChild(a);
    
    a.click();
    
    window.URL.revokeObjectURL(url);
    
    alert('your file has downloaded!'); // or you know, something with better UX...
    

    })

    .catch(() => alert(‘oh no!’));

基于jQuery / iframe / Cookie的原始方法

Bluish完全正确,您不能通过Ajax来实现,因为JavaScript无法将文件直接保存到用户的计算机(出于安全考虑)。不幸的是,将
主窗口的 URL 指向文件下载意味着您​​几乎无法控制文件下载发生时的用户体验。

我创建了jQuery File Download,它允许通过OnSuccess和OnFailure回调完成文件下载,从而获得“类似于Ajax”的体验,从而提供更好的用户体验。看看我的博客文章,了解该插件解决的常见问题以及使用该插件的一些方法,以及实际使用的jQuery文件下载演示。

这是一个使用带有Promise的插件源的简单用例演示。

$.fileDownload('some/file.pdf')
    .done(function () { alert('File download a success!'); })
    .fail(function () { alert('File download failed!'); });


 类似资料:
  • 我试图使简单的文件服务器。我有Node.js后端与MongoDB GridFS存储存储文件。我从服务器获取文件通过。在前端,我使用Angular。我有两个主要问题: 当我使用Blob提供下载服务时,变成:“d1c393df-b0d9-4ae5-befe-8d45b183eb54…”友善的我读了很多关于它的文档,没有找到任何解决方案 当我只通过Express提供下载服务而不进行身份验证时,文件会正确

  • 下面是Java样例代码 import java.io.IOException; import com.xiaomi.infra.galaxy.fds.client.FDSClientConfiguration; import com.xiaomi.infra.galaxy.fds.client.GalaxyFDS; import com.xiaomi.infra.galaxy.fds.clien

  • 有人成功地从linux终端下载了wetransfer链接吗? thnx mart

  • 问题内容: 我正在构建一个应用程序,以从后端服务器下载PDF文件。我写了以下代码: 在后端服务器上,方法如下: 我从我的适配器调用此rest方法为: 通话结束后,我从此服务获得以下响应: 如何解析此响应为PDF文件并将其显示给用户?当我使用以下代码从应用程序中简单地调用此适配器方法时,当我右键单击适配器并选择运行为“调用移动适配器”时,也会收到此响应: 我在浏览器的控制台上得到了相同的响应,但是正

  • 问题内容: 我有一个基于jquery的单页webapp。它通过AJAX调用与RESTful Web服务进行通信。 我正在尝试完成以下任务: 将包含JSON数据的POST提交到REST URL。 如果请求指定JSON响应,则返回JSON。 如果请求指定PDF / XLS / etc响应,则返回可下载的二进制文件。 我现在有1&2,并且客户端jquery应用通过基于JSON数据创建DOM元素在网页上显

  • 问题内容: 我正在使用使用build.xml文件的ant。这是命令: Java版本:1.8.0蚂蚁版本:1.7.1 它挂在这里: 我收到连接超时错误: Ant还调用了从maven存储库中获取一些文件的方法,build.xml文件的一部分是这样的: 我将这些行放入build.xml文件中: 仍然与Maven进行蚂蚁连接,以通过http挂起获取一些jar文件。我这样做对吗?谢谢。 问题答案: 您正在混