如何在节点js

时间:2016-11-23 06:31:37

标签: javascript php node.js mime ebay-api

我收到了来自ebay-api的回复

  

- MIMEBoundaryurn_uuid_C91296EA5FF69EE9571479882375576​​565344 Content-Type:application / xop + xml;字符集= UTF-8;类型= “文本/ xml” 的   内容传输编码:二进制内容ID:   < 0.urn:UUID:C91296EA5FF69EE9571479882375576​​565345>

     

Success1.1.02016-11-23T06:26:15.576Z514   --MIMEBoundaryurn_uuid_C91296EA5FF69EE9571479882375574545344内容类型:application / zip内容 - 传输 - 编码:二进制   Content-ID:

     

PKY'uIi [ @ 50014028337_report.xmlUTy 2Xy 2Xux                                                              00 R j @ + [ PlX# ( x,=l q)Lfewc wĤ O 1 HT t GGT   6;” $ =分米; C ^} WߦRWA   fgI4Ux3fғ{FXJ,+ I%5B'sG,#吨,L {CMD笓)!9           沫; 8_1< iyszu =Ջ^ 2 S%+ 22`QV $ 〜?wǥ_Q퉦“PKY'uIi [@ 50014028337_report.xmlUTy2Xux                                                                                                                                     00PK \   --MIMEBoundaryurn_uuid_C91296EA5FF69EE9571479882375576​​565344 -

这是字符串类型。我提取了附加的zip文件数据,即

  

PKY'uIi [ @ 50014028337_report.xmlUTy 2Xy 2Xux                                                              00 R j @ + [ PlX# ( x,=l q)Lfewc wĤ O 1 HT t GGT   6;” $ =分米; C ^} WߦRWA   fgI4Ux3fғ{FXJ,+ I%5B'sG,#吨,L {CMD笓)!9           沫; 8_1< iyszu =Ջ^ 2 S%+ 22`QV $ 〜?wǥ_Q퉦“PKY'uIi [@ 50014028338_report.xmlUTy2Xux                                                                                                                                     00PK \

这表明它中有一个report.xml。因此,当我在zip文件中写入此数据时,它会创建一个zip文件,并在提取时出错。

fs.writeFile("./static/DownloadFile.zip", fileData, 'binary', function(err){
                  if (err) throw err;
                  console.log("success");
                  });

如何正确地将这些数据写入zip文件中。请咨询。如果需要更多信息。

修改: 我尝试用PHP编写zip文件,并且用这段代码编写它:

$zipFilename="DownloadFile.zip";
        $data       =   $fileData;
        $handler = fopen($zipFilename, 'wb')
            or die("Failed. Cannot Open $zipFilename to Write!</b></p>");
        fwrite($handler, $data);
        fclose($handler);

请建议我如何在nodejs中实现相同的目标。

2 个答案:

答案 0 :(得分:3)

根据您使用的HTTP客户端的实现,可能会有一些变化。

使用axios,我正在做类似的事情:

  • 我正在请求一个zip文件,因此我将Accept标头指定为application/zip
  • 为了获得buffer而不是Binary,请将responseType指定为arrayBuffer
const res = await axios.get('/routToThat/file', {
  headers: {
    Accept: 'application/zip',
  },
  responseType: 'arraybuffer',
});

通过后者,而不是从响应中接收到Binary

A@B�ArE⏾�7�ϫ���f�걺N�����Yg���o_M^�D�T�U X_���e?� hi\...

我收到一个缓冲区:

Buffer(22781691) [80, 75, 3, …]

请求解决后,有了缓冲区,我就使用writeFile中相同的fs函数

注意:我没有在Encoding

中指定writeFile
fs.writeFile(name, res.data, (err) => {
  if (err) throw err;
  console.log("success");
});

答案 1 :(得分:1)

正如我在您的代码示例中看到的,您的二进制数据已被请求模块损坏。只需在请求设置中使用

encoding:null

并且zip文件是正文中的有效二进制文件(现在是缓冲区而不是utf-8字符串!),您可以解压缩。只要您看到问题标记,您仍然会遇到编码问题。