相关疑难解决方法(0)

如何设置HTTP GET请求的标头,并触发文件下载?

更新 20140702:

(但我将其他一个答案标记为接受而不是我自己的答案,因为它让我在那里一半,并奖励努力)


似乎无法通过链接设置HTTP请求标头<a href="...">,并且只能使用XMLHttpRequest.

但是,链接到的URL是应该下载的文件(浏览器不应该导航到它的URL),我不确定这是否可以使用AJAX完成.

此外,返回的文件是二进制文件,而AJAX不适用于此.

如何使用添加了自定义标头的HTTP请求触发文件下载?

编辑:修复损坏的链接

javascript ajax download http-headers

53
推荐指数
5
解决办法
9万
查看次数

使用Javascript File API保存文件会导致错误的编码

我有一个问题(或可能是两个)使用HTML5 File API保存文件.

文件作为字节数组来自服务器,我需要保存它.我在SO上尝试了几种方法:

  • 创建blob并在新选项卡中打开它
  • 在href属性中使用"data:"创建隐藏的achor标记
  • 使用FileSaver.js

所有方法都允许保存文件,但通过将编码更改为UTF-8来打破它,而文件(在当前测试用例中)是ANSI.似乎我遇到了问题:在服务器端和客户端.

服务器端: 服务器端是ASP.NET Web API 2应用程序,该控制器使用带有StreamContent的HttpResponseMessage发送文件.ContentType是正确的,并与实际文件类型相对应.

但是在下面的屏幕截图中可以看到服务器的答案(data.length)小于上传时计算的实际文件大小(file.size).此外可以看到HTML5 File对象还有另一个大小(f.size).

默认文件发送

如果我将值为"ANSI"的CharSet添加到服务器的响应消息的ContentType属性中,则文件数据将与上载的相同,但是在保存结果文件时仍然具有错误的大小并且会损坏:

在此输入图像描述

客户端: 我尝试使用JS File选项设置charset,但它没有帮助.正如在这里这里可以找到的那样,FileUplaod.js的作者Eli Gray说

类型中的encoding/charset只是浏览器的元数据,而不是编码指令.

这意味着,如果我理解正确的话,就不可能改变文件的编码.

问题结果:最后我可以成功下载无法打开的损坏文件. 原始和下载的文件

所以我有两个问题:

  1. 如何使用File API"按原样"保存文件.目前我不能使用直接链接和'下载'属性的简单方法,因为服务器端检查请求标头中的access_token.可能这是"瓶颈"的问题?
  2. 如何避免在服务器端设置CharSet并同时"按原样"发送字节数组?虽然这个问题可能会以某种方式被黑客入侵,但我认为这更为关键.例如,虽然"ANSI"字符集解决了当前文件的问题,但WinMerge显示它的编码是西里尔字母'Windows-1251',也可以是任何其他编码.

PS问题与除*.txt之外的所有文件类型(扩展名)有关.

更新

服务器端代码:

public HttpResponseMessage DownloadAttachment(Guid fileId)
{
    var stream = GetFileStream(fileId);

    var message = new HttpResponseMessage(HttpStatusCode.OK);
    message.Content = new StreamContent(stream);
    message.Content.Headers.ContentLength = file.Size;
    message.Content.Headers.ContentType = new MediaTypeHeaderValue(file.ContentType)
        {
            // without this charset files sent with bigger size
            // than they are as shown on image 1
            CharSet …
Run Code Online (Sandbox Code Playgroud)

javascript encoding download fileapi asp.net-web-api

5
推荐指数
0
解决办法
946
查看次数

接收一个Zip文件作为对AJAX请求的响应

因此,我在一个需要调用服务器并返回zip文件的网站上工作,事实是我不确定自己是否做对了所有事情。代码看起来像这样:

function download(){
  if($('.download').hasClass('activeBtn')){
    $.ajax({
        type: 'GET',
        url: someUrl,
        contentType: 'application/zip',
        dataType: 'text',
        headers: {
            'Api-Version': '3.4'
        }

    }).then(function (data) {
      console.log(data); //Basically prints the byte array
      //Here I should build the file and download it
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我需要使用响应中的字节数组来填充文件,我该怎么做?

javascript ajax jquery zip http

4
推荐指数
1
解决办法
2万
查看次数