【问题标题】:How do I send data to my server and have it return it as a file如何将数据发送到我的服务器并让它作为文件返回
【发布时间】:2015-06-07 10:51:43
【问题描述】:

我无法(afaik)在我的(javascript 浏览器)客户端中创建文件,因此我希望我的服务器在将其发送回客户端之前执行此操作,然后客户端会打开一个对话框,询问用户将文件保存在哪里。

我如何实现这一目标?请参阅下面的内容,了解我目前拥有的内容。

客户

$.ajax({
        type: 'POST',
        dataType: 'json',
        url: "http://localhost:5000/api/file",
        data: postData,
        contentType : 'application/json',
        success: function (responseData, textStatus, jqXHR) {
            // What do I put here?
        },
        error: function (jqXHR, textStatus, errorThrown) {
            alert(errorThrown);
        }
    });

服务器

router.post('/file', function (request, response) {
        var content = '';
        request.on('data', function (data) {
            content += data;
        });

        request.on('end', function () {
            var contentAsJson = JSON.parse(content);
            response.set("Content-Type", "text/plain");
            response.set("Content-Length", contentAsJson.text.length);
            response.set("Content-Disposition", 'attachment; filename='filename.txt');
            response.send(contentAsJson.text);
        });
    });

【问题讨论】:

  • 您遇到了什么问题?它是否返回错误的数据?它会引发某种错误吗?
  • 我得到了按预期返回的数据。我思考的是让客户端通过对话将其存储为文件。但是@orcaman 只是告诉我,我根本不需要将它发送到我的服务器。
  • 我仍然对“正确”(?)方式感兴趣吗?我认为@orcaman 的答案是一个 hack,因为我假设由于安全原因,javascript 客户端无法创建和保存文件。
  • @MdaG 不是黑客。适用于所有“普通”浏览器。唯一不受支持的是 blob 对象,它是在几年前引入的。

标签: javascript node.js


【解决方案1】:

实际上你可以只用JS在客户端生成文件的二进制流,你不必将数据发布到服务器。

首先,创建数据的二进制表示:

var str = <<your data as string>>
var uint = new Uint8Array(str.length);
for (var i = 0, j = str.length; i < j; ++i) {
    uint[i] = str.charCodeAt(i);
}

然后,请求将其保存为文件:

var sampleBytes = <<your typed array with the data>>;

var saveByteArray = (function () {
    var a = document.createElement("a");
    document.body.appendChild(a);
    a.style = "display: none";
    return function (data, name) {
        var blob = new Blob(data, {type: "octet/stream"}),
            url = window.URL.createObjectURL(blob);
        a.href = url;
        a.download = name;
        a.click();
        window.URL.revokeObjectURL(url);
    };
}());

saveByteArray([sampleBytes], 'example.txt');

【讨论】:

  • 虽然这是一个很棒的解决方案,但也值得指出的是,它不适用于 IE9 及更低版本(其他浏览器当然支持它很久了)。
  • 非常好。谢谢!
  • 干杯。如果这对您有用,请随时接受答案。 :-)
猜你喜欢
  • 2013-10-01
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 2011-11-28
相关资源
最近更新 更多