2012-02-28 64 views
4

我試圖設計一種方法來上傳文件從URL到S3使用請求和Knox。目前,我的代碼如下所示:NodeJS:上傳遠程文件到S3與請求和Knox

request(item.productImage, function(err, res, body) { 
    if (!err && res.statusCode == 200) { 
    fs.writeFile('/tmp/' + filename, body, 'base64', function(err, data){ 
     if (err) { 
     return console.log(err); 
     } 

     client.putFile('/tmp/' + filename, '/item/' + item._id + '/' + filename, function(err, res) { 
     if (err) { 
      return console.log(err); 
     } 
     }); 
    }); 
    } 
}); 

這不起作用,因爲它在停止前下載大約652字節的4kb文件。奇怪的是,如果我不提供fs.writeFile()的回調,它會在本地下載整個4kb。

完成此操作的最佳方法是什麼?

+0

感謝您的提問。我正要問同樣的問題,我在這裏也得到了答案。 – user644745 2012-03-03 03:36:02

回答

10

在Stackoverflow上有很多這方面的問題,但我似乎找不到能解答你的問題的問題。解決方案應該工作,但是,我現在無法讓knox在我的機器上工作。我希望你會更幸運!

更新:我似乎有一些問題與S3這裏,下面的代碼工作 - 我確實改變了一件事,你需要指定encodingnull要求,所以你得到一個Buffer回來。否則,二進制數據將無法很好地工作。

request(item.productImage, {encoding: null}, function(err, res, body) { 
    if(!err && res.statusCode == 200) { 
    var req = client.put('/item/' + item._id + '/' + filename, { 
     'Content-Type': res.headers['content-type'], 
     'Content-Length': res.headers['content-length'] 
    }); 

    req.on('response', function(res) { 
     console.log('response from s3, status:', res.statusCode, 'url:', req.url); 
    }); 

    req.on('error', function(err) { 
     console.error('Error uploading to s3:', err); 
    }); 

    req.end(body); 
    } 
}); 

注意:使用此解決方案,您就不必在文件中buffer to disk - 這就是爲什麼我選擇使用諾克斯客戶端的較低水平put方法。

+1

優秀。我確實需要改變'content-type'和'content-length'的大寫字母,因爲看起來S3或者Knox都對它敏感。直到我遇到403錯誤。 – James 2012-02-28 18:29:03

+0

糟糕,我在測試程序中確實有過這種情況。上面編輯。謝謝。 – 2012-02-28 23:23:52

+0

我也在用這個。但我得到403狀態代碼....網址也似乎並不完全正確。 「來自S3的響應,狀態:403 url:http://zzzzzz.s3.amazonaws.com \ static \ ima ges \ thumbnail \ abcd.jpg」 – user644745 2012-03-03 05:30:58

相關問題