我刚开始在ExpressJS网络应用程序中使用gcloud-node并且已经遇到了一个非常基本的问题,但我无法理解。
我可以上传文件没问题。我用:
fs.createReadStream(req.files.file.path)
.pipe(bucket.createWriteStream(name))
在我的谷歌开发者控制台中查看我在我的桶中看到的文件,例如名称:54314eddacd67fc858bf473f / 543ba7bb387b56b908f2b1e4.jpg
当我尝试使用该名称下载时,即:
bucket.createReadStream(file.name)
.pipe(res)
.on('error', function(err) {
errorResponseHandler.handleError(res, err);
});
我收到此错误:
uncaughtException: Not Found
Error: Not Found
at Object.handleResp (/Users/ruairiobrien/Dev/testApp/node_modules/gcloud/lib/common/util.js:168:14)
at Bucket.makeReq_ (/Users/ruairiobrien/Dev/testApp/node_modules/gcloud/lib/storage/index.js:580:10)
at Request.Connection.req [as _callback] (/Users/ruairiobrien/Dev/testApp/node_modules/gcloud/lib/common/connection.js:251:16)
at Request.init.self.callback (/Users/ruairiobrien/Dev/testApp/node_modules/gcloud/node_modules/request/request.js:199:22)
at Request.emit (events.js:98:17)
at Request.onResponse (/Users/ruairiobrien/Dev/testApp/node_modules/gcloud/node_modules/request/request.js:1160:14)
at Request.emit (events.js:117:20)
at IncomingMessage.Request.onResponse.strings (/Users/ruairiobrien/Dev/testApp/node_modules/gcloud/node_modules/request/request.js:1111:12)
at IncomingMessage.emit (events.js:117:20)
at _stream_readable.js:929:16
我已经调试过,我确信存储桶中存在名称正确的文件。
我真的很难过,所以任何帮助都会非常感激。
我已经尝试将文件写入我的本地文件系统,而不是在响应中,并得到了相同的错误。
正在运行的临时(或永久)解决方法是:
bucket.getSignedUrl({
action: 'read',
expires: Math.round(Date.now() / 1000) + (60 * 60 * 24), // 1 day.
resource: file.name
}, function (err, url) {
res.redirect(url);
});
该解决方法工作正常,但无法帮助我找出createReadStream失败的原因,因为它显示文件名和存储桶是正确的。
答案 0 :(得分:1)
我认为您可能正在使用gcloud-node
的过时版本。以下是我如何上传和下载最新版本(截至今天,这是v0.14.0)。
var fs = require('fs');
var gcloud = require('gcloud');
var project = gcloud({
projectId: 'your-project-id',
// keyFilename: '/path/to/your/keyfile.json'
});
var bucket = project.storage().bucket('your-bucket-name');
var filename = 'local-file-name';
var file = bucket.file(filename); // This is a gcloud.File
var getFiles = function() {
bucket.getFiles(function(err, files) {
console.log('Files were', files);
});
};
var createFile = function() {
fs.createReadStream(filename)
.pipe(file.createWriteStream())
.on('error', function (err) {
console.log('Error!', err);
})
.on('complete', function(result) {
console.log('Complete!', result);
});
};
var getFile = function() {
file.createReadStream()
.pipe(fs.createWriteStream(filename + '.downloaded'))
.on('error', function(err) {
console.log('Error downloading!', err);
});
}
createFile();
getFile();
运行此脚本应在您的存储桶(local-file-name
)上传文件(your-bucket-name
),然后将该文件下载为local-file-name.download
)。
一些引用的引用(每个页面都应该有例子):