【发布时间】:2017-04-02 13:28:26
【问题描述】:
我正在开发一个使用 Google Cloud Storage 的项目,以允许用户使用 Node.js 将媒体文件上传到预定义的存储桶中。我一直在用小的 .jpg 文件进行测试。我还使用gsutil 将存储桶权限设置为公开。
首先,所有文件都生成了下载文件的链接。通过对文档的调查,我了解到我可以在使用gsutil CLI 上传后明确设置每个文件的Content-Type。当我使用此过程将文件类型设置为'image/jpeg' 时,链接行为更改为在浏览器中显示图像。但这仅在使用 gsutil 更新元数据之前未单击链接的情况下才有效。我认为这可能是由于浏览器缓存造成的,但该行为在隐身浏览器中重复。
使用gsutil 设置mime 类型无论如何都是不切实际的,因此我修改了我的节点服务器POST 函数中的代码,以便在上传时使用名为npm 的模块mime 设置元数据。代码如下:
app.post('/api/assets', multer.single('qqfile'), function (req, res, next) {
console.log(req.file);
if (!req.file) {
return ('400 - No file uploaded.');
}
// Create a new blob in the bucket and upload the file data.
var blob = bucket.file(req.file.originalname);
var blobStream = blob.createWriteStream();
var metadata = {
contentType: mime.lookup(req.file.originalname)
};
blobStream.on('error', function (err) {
return next(err);
});
blobStream.on('finish', function () {
blob.setMetadata(metadata, function(err, response){
console.log(response);
// The public URL can be used to directly access the file via HTTP.
var publicUrl = format(
'https://storage.googleapis.com/%s/%s',
bucket.name, blob.name);
res.status(200).send(
{
'success': true,
'publicUrl': publicUrl,
'mediaLink': response.mediaLink
});
});
});
blobStream.end(req.file.buffer);
});
这似乎有效,因为它确实在上传时设置了Content-Type,并且正确反映在响应对象和云存储控制台中。问题是某些返回为publicUrl 的链接会导致文件下载,而其他链接会导致浏览器加载图像。理想情况下,我希望这两个选项都可用,但我看不到存储的文件或其元数据有任何差异。
我在这里错过了什么?
【问题讨论】:
标签: node.js google-cloud-storage