0

我从 Node.js 服务器(使用 Express)下载文件时遇到问题。该请求得到了正确处理,并且在现有文件上调用了 response.download 文件。但是当客户端接收到数据时,并不是所有的数据都被接收到,并且从它创建的 blob 膨胀到几乎两倍的大小。

服务器部分(使用 Express 的 Node.js),我将帖子路由到 /php/mixMovie.php,重新实现现有后端,是这样的:

app.post( '/php/mixMovie.php', function( request, response ){
    ....
    console.log( 'serving ' + destFile );
    fs.stat( destFile, function (err, stats) {
        console.log(stats.size);
    });
    response.download( destFile );
 });

给出控制台输出:

serving /Users/j/[...]/WTSc5e8f500-ad76-4fe5-b368-3a0f3e848813.ogg
326049
serving /Users/j/[...]/WTSc5e8f500-ad76-4fe5-b368-3a0f3e848813.ogg
326049
...

客户端有这个javascript代码:

$.ajax({
    type: 'POST',
    url: 'http://localhost:8000/php/mixMovie.php',
    data: fd,
    processData: false,
    contentType: false
} ).done( function( data ){
    console.log( data.length );
    var bb = new Blob( [ data ], { type:'movie/ogg' } );
    console.log( bb.size );
} );

给出这个令人惊讶的输出:

XHR finished loading: ("http://localhost:8000/php/mixMovie.php"). jquery-1.8.3.js:8434
314947
600641
XHR finished loading: ("http://localhost:8000/php/mixMovie.php"). jquery-1.8.3.js:8434
315028
600737
XHR finished loading: ("http://localhost:8000/php/mixMovie.php"). jquery-1.8.3.js:8434
315020
600439
XHR finished loading: ("http://localhost:8000/php/mixMovie.php"). jquery-1.8.3.js:8434
315026
600421 

有谁知道这里发生了什么?

谢谢,

Ĵ

4

1 回答 1

1

我认为这里发生的是这个调用中的数据变量:

  $.ajax({
      type: 'POST',
      url: 'http://localhost:8000/php/mixMovie.php',
      data: fd,
      processData: false,
      contentType: false
  } ).done( function( data ){
      console.log( data.length );
      var bb = new Blob( [ data ], { type:'movie/ogg' } );
      console.log( bb.size );
  } );

是 String 类型(您可以使用简单的 来验证这一点console.log(typeof data))。当您构建 Blob 时,它会将您的数据视为字符串并将其编码为一系列 UTF-8 字符,然后调用 getBytes() 并返回结果(请参阅此处的第 6.1.4.2 节:http://www.w3 .org/TR/FileAPI/#dfn-Blob)。

这会导致数据大小几乎翻倍并使生成的文件无法使用(除非它实际上是一个字符串!)。

至于如何修复它,也许您可​​以尝试将数据转换为任何 ArrayBuffer,如下所述:Does jQuery $.ajax or $.load allow for responseType arrayBuffer?

于 2014-01-25T08:01:56.590 回答