将文本框中的文本保存为文件并强制浏览器下载

16 浏览
0 Comments

将文本框中的文本保存为文件并强制浏览器下载

我有一个JavaScript应用程序,它向特定的URL发送ajax POST请求。响应可能是一个JSON字符串,也可能是一个文件(作为附件)。我可以轻松地在我的ajax调用中检测到Content-Type和Content-Disposition,但是一旦我检测到响应包含文件,我该如何提供客户端下载它呢?我在这里看过许多类似的讨论,但没有一个提供我正在寻找的答案。

请,请,请不要提供不应使用ajax进行此操作的答案,也不要建议我重定向浏览器,因为这些都不是选项。使用纯HTML表单也不是一个选项。我所需要的是向客户端显示一个下载对话框。这可以做到吗?如何做到?

0
0 Comments

在现代浏览器中,可以使用FileAPI的一部分来解决(Save texts from textarea as file and force browser to download)这个问题。

问题的解决方法如下:

1. 首先,需要创建一个XMLHttpRequest对象,并将请求的方法设置为POST,URL设置为指定的url,异步设置为true。

2. 接下来,设置响应类型为blob,以便获取二进制数据。

3. 在请求的load事件中,判断响应的状态是否为200,如果是,则进一步处理。

4. 通过调用xhr.getResponseHeader('Content-Disposition')获取响应头中的Content-Disposition字段,并解析出文件名。

5. 判断浏览器是否支持window.navigator.msSaveBlob方法,如果支持,则使用该方法保存文件。

6. 如果不支持,需要使用URL.createObjectURL方法创建临时的下载链接。

7. 如果存在文件名,则创建一个标签,并设置其href属性为下载链接,将文件名设置为下载属性。

8. 将标签添加到页面中,并调用其click方法模拟点击事件触发下载。

9. 如果没有文件名,则直接使用window.location.href进行下载。

10. 最后,使用setTimeout函数设置一个延时,清除临时下载链接。

以上是通过原生XMLHttpRequest和jQuery.ajax方法来实现的解决方案。

问题出现的原因可能是在Chrome、Edge等浏览器中,Content-Disposition字段始终为null。这可能是由于CORS问题导致的,需要检查Access-Control-Expose-Headers是否包含Content-Disposition或通配符。

还有一种可能是文件名中包含了转义的引号,或者服务器返回的字段不是filename=而是filename*=。

在更改下载链接时,可以通过修改URL.createObjectURL(blob)方法中的参数来实现。如果需要创建csv文件并保存到自定义文件夹中,则需要将点击动作的地址指向该文件夹。

需要注意的是,以上解决方案可能无法正确获取文件名,如果文件名中包含转义的引号或服务器返回的字段不是filename=而是filename*=。

0
0 Comments

问题的原因是希望将通过将JSON数据发送到服务器,并将服务器返回的Excel文件作为响应下载到客户端。解决方法是使用XMLHttpRequest发送POST请求,将响应内容以blob(binary)的形式保存,并创建一个可下载的链接,然后模拟点击该链接进行下载。

在上述代码中,通过XMLHttpRequest将数组作为JSON数据发送到服务器。在将内容作为blob(binary)获取后,创建一个可下载的链接并将其附加到一个不可见的"a"链接上,然后模拟点击该链接进行下载。

在服务器端,需要根据使用的编程语言设置一些头部信息。在Python Django中,可以使用HttpResponse设置响应内容的类型为"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",以适应下载xls(excel)文件的需求。根据实际文件类型,需要相应地设置content_type。

通过这种方法,可以下载任何类型的文件。

0
0 Comments

问题的原因是在网页中,用户需要将文本框中的内容保存为文件并强制浏览器下载。但是使用普通的HTML表单提交方法会导致页面跳转,无法满足需求。解决方法是通过使用POST方法的表单提交,并在服务器响应时添加文件的MIME类型的响应头部,以触发下载对话框。

解决方法如下:

1. 创建一个表单,并使用POST方法提交表单。可以通过隐藏表单和程序化填充的方式来实现。

2. 在服务器响应时,根据所使用的编程语言,设置响应头部的Content-Type为application/download,以指定下载文件的MIME类型。

3. 如果服务器返回的是JSON字符串,则在接收响应后进行处理并呈现给客户端。

4. 如果服务器返回的是文件作为附件,则会触发下载对话框。

需要注意的是,这种方法在Chrome和Firefox浏览器中运行良好,但在IE11浏览器中可能会出现问题。此外,还有一位用户提出了如何处理来自后端的错误消息的问题,但并未得到解答。

值得一提的是,有用户指出无法在https://www.iana.org/assignments/media-types/media-types.xhtml中找到application/download类型。

0