当前位置: 首页 > 知识库问答 >
问题:

节点:Express:如何处理应用程序/八位字节流;字符集=;UTF-8响应?

嵇弘新
2023-03-14

我有一个节点-快递应用程序。在那里,我试图调用一个API,它响应一个原始的xlsx对象作为

'Content-Type':'应用程序/八位流;charset=; UTF-8'

编写如何调用API的代码:

var unirest = require("unirest");

var reqClient = unirest("POST", "https://api.application.com/getExcel");
reqClient.headers({ "Authorization": "Bearer " + req.session.passport.user.token, 
"content-type": req.headers['content-type'], "application/json"});
reqClient.type("json");
reqClient.send(JSON.stringify(requestbody));
reqClient.end(function(res) {
if (res.error) throw new Error(res.error);
console.log(res.body);
});

现在我正试图用这些数据做两件事。

  1. 将其写入excel文件。下面是我尝试的代码:
    let data = res.body // res is the response coming from the API
    let buf = Buffer.from(data);
    excelfile = fs.createWriteStream("result.xlsx");
    excelfile.write(buf);
    excelfile.end();
    let data = res.body // res is the response coming from the API
    let buf = Buffer.from(data);
    response.write(buf); //response is the response to the request to ui
    response.end();

因此,在这两种情况下,文件都会损坏。

但是API响应是完美的,因为当它被UI直接使用时,xlsx文件正在正确生成。

共有1个答案

廉元龙
2023-03-14

处理二进制数据时,必须将编码设置为null

reqClient.encoding(null)
js prettyprint-override">reqClient.encoding(null)
reqClient.end(function(res) {
    if (res.error) {
       return response.status(500).send('error');
    }

    // res.body is now a buffer
    response.write(res.body);
    response.end();
});

否则,数据将被转换为UTF-8,您不能从UTF-8转换回二进制并获得相同的数据,这就是您正在做的:

Buffer.from(res.body)

推荐的方法是直接使用流,我没有看到在unirest中以简单的方式做到这一点的方法,我建议使用请求get,这样您可以。管道直接到一个文件或表达式res

 类似资料:
  • 我不清楚它们是什么,也不知道什么时候使用它们。 在这个例子中,我有一个REST客户端,我想发送一个文件(.zip文件),如果我使用其中任何一种类型,会发生什么 我猜application/octet-stream相当于application/zip,这只是为了向另一方提供有关传输数据的提示,文件以某种方式进行了编码 多部分/表单数据以某种方式破坏数据,您可以通过其特定的mime类型传递“多个数据”

  • 问题内容: 我正在尝试使用Java方法从数据库中获取以下xml,但出现错误 用于解析xml的代码 数据 错误 我读了一些线程,这是因为xml中有一些特殊字符。如何解决这个问题? 问题答案: 如何解决这个问题? 使用正确的字符编码读取数据。错误消息表示您正在尝试以UTF-8格式读取数据(故意或因为这是未指定的XML文件的默认编码),但实际上它采用的是其他编码,例如ISO-8859-1或Windows

  • 最近我为下载创建了一个子域,我希望浏览器下载文件,而不是查看文件。为此,我在文件: 在Firefox和GoogleChrome上,它可以正常工作,但微软浏览器-Internet Explorer和微软Edge都忽略了MIME类型,而是查看它们。我怎样才能强迫他们也下载这些文件呢?

  • 我有一个第三方服务,它用文件向我的Django应用程序发出POST请求。要成功上传到Django应用程序,请求必须具有“多部分/表单数据”内容类型,但在我的案例和请求中,内容类型是“八位流”。文件总是空的。我怎么能在Django中接收八位流内容类型的文件?

  • 我写一个服务器端应用程序与嵌入jetty接收一些请求从第三方客户端。客户端将一些小文件上传到服务器。但是我很惊讶地看到,客户端并没有上传文件数据作为应用程序/八位流,而是上传了一个json作为应用程序/json,其中包括文件的所有元数据,并在一个字段中将所有数据作为字符串 {“_id”:“水果”,“名称”:“水果”,“_shasum”:“4954f1f8b4a8cbf9ea6b675face476

  • 问题内容: 我有一个包含阿拉伯字符的xml文件。尝试解析文件时,出现异常,MalformedByteSequenceException:2字节UTF-8序列的无效字节2。我使用POI DOM来解析文档。 日志是 该异常仅在Windows Machine中出现,在Linux Machine中不出现。我该如何解决此问题。任何建议都应是可取的。 问题答案: 我已解决问题,方法是使用UTF8格式创建XML