我正在使用Google雲端存儲開展一個項目,以允許用戶使用Node.js將媒體文件上傳到預定義存儲桶。我一直在用小的.jpg
文件進行測試。我還使用gsutil
將存儲區權限設置爲公共。Google雲端存儲創建具有不一致行爲的內容鏈接
首先,所有文件都會生成下載文件的鏈接。在對文檔進行調查後,我瞭解到,使用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
會導致文件下載,而其他鏈接會導致瀏覽器加載圖像。理想情況下,我希望這兩個選項都可用,但我無法看到存儲的文件或其元數據中的任何差異。
我在這裏錯過了什麼?
我檢查了所有文件都正確標記了適當的MIME類型,沒有標記爲'application-octet-stream'。此外,我確認沒有設置「Content-Disposition」值,但只是爲了矯枉過正,在服務器代碼中明確添加了一行代碼,以便在元數據中將其標記爲空。一時興起,我重複了其中一個'。 jpg'文件並將擴展名更改爲'.jpeg'。 '.jpeg'文件正確加載,而'.jpg'版本仍然下載。完全相同的文件。但其他帶'.jpg'擴展名的工作很好。 – espressoAndCode
有趣。這就是使用「https://storage.googleapis.com/bucketName/imageName.jpg」或「imageName」的網址。jpeg「在瀏覽器中? –
這是正確的,我剛剛運行了另一個測試,我在上傳的元數據上明確添加了'inline'的'Content-Disposition'值,我刪除了存儲中的所有文件,上面描述的'.jpeg'變體響應對象*和*雲存儲控制檯驗證mime類型和配置是否按預期設置,只是這次我得到了完全相反的行爲,'.jpeg'文件顯示在瀏覽器中,而'.jpg'版本下載令人沮喪! – espressoAndCode