使用nodejs上传大文件

时间:2011-07-12 12:35:39

标签: javascript file node.js upload

我有以下nodejs代码,它通过调用服务器端API(由我编写)上传文件并将文件内容作为多部分请求传递。问题是我的代码与小文件完美配合,但是大文件(1 MB或更高)失败。我很确定这是我的代码中的一个问题,但我无法弄清楚它是什么。

        // assume file content have been read into post_data array
        //Make post
        var google = http.createClient(443, host, secure = true);
        var filepath = '/v2_0/put_file/';
        var GMTdate = (new Date()).toGMTString();
        var fileName = encodeURIComponent(destination);
        console.log("fileName : " + fileName);
        console.log("Path : " + filepath);
        var header = {
            'Host': host,
            'Authorization': 'Basic ' + authStr,
            'Content-Type': 'multipart/form-data; boundary=0xLhTaLbOkNdArZ',
            'Last-Modified': GMTdate,
            'Filename': fileName,
            'Last-Access-By': username
        };
        var request = google.request('POST', filepath, header);
        for (var i = 0; i < post_data.length; i++) {
            request.write(post_data[i]);
        }
        request.end();
        request.addListener('response', function(response){
            var noBytest = 0;
            response.setEncoding('utf8');
            console.log('STATUS: ' + response);
            console.log('STATUS: ' + response.statusCode);
            console.log('HEADERS: ' + JSON.stringify(response.headers));
            console.log('File Size: ' + response.headers['content-length'] + " bytes.");

从日志中,我看到控制权来自request.end();但我没有看到在request.addListener()块之后写的最后几个日志。

在过去的几天里,我一直在试着理解为什么它适用于小文件但不适用于较大的文件。我没有看到任何超时,代码似乎只是挂起,直到我把它杀掉。

任何人都可以指导我做错什么吗?

更新:

post_data是一个数组,这就是我正在做的事情

post_data = [];
console.log('ContentType =' + ContentType + "\n\nEncoding Style =" + encodingStyle);
post_data.push(new Buffer(EncodeFilePart(boundary, ContentType, 'theFile', FileNameOnly), 'ascii'));
var file_contents = '';
var file_reader = fs.createReadStream(filename, {
    encoding: encodingStyle
});

file_reader.on('data', function(data){
    console.log('in data');
    file_contents += data;
});

file_reader.on('end', function(){
    post_data.push(new Buffer(file_contents, encodingStyle))
    post_data.push(new Buffer("\r\n--" + boundary + "--\r\n", 'ascii'));
     ...
        var request = google.request('POST', filepath, header);
        for (var i = 0; i < post_data.length; i++) {
            request.write(post_data[i]);
        }

我期待你的建议。

2 个答案:

答案 0 :(得分:1)

您应该将数组或字符串传递给request.write。 post_data是字符串数组还是数组数组?

此外,您将其发布为multipart / form-data,这意味着您必须将数据修改为该格式。你有没有这样做,或者post_data只是文件中的原始数据?

答案 1 :(得分:-1)