2016-11-18 63 views
0

我正在使用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會導致文件下載,而其他鏈接會導致瀏覽器加載圖像。理想情況下,我希望這兩個選項都可用,但我無法看到存儲的文件或其元數據中的任何差異。

我在這裏錯過了什麼?

回答

0

Google雲端存儲不會假定上傳對象的內容類型。如果你沒有指定,GCS將簡單地分配一種「application/octet-stream」。

但是,命令行工具gsutil更智能,並且會將正確的Content-Type附加到大多數情況下正在上傳的文件中,包括JPEG。

現在,您的瀏覽器可能會下載圖片而不是顯示它們的原因有兩個。首先,如果Content-Type設置爲「application/octet-stream」,大多數瀏覽器會將結果作爲文件下載而不是顯示它們。這可能發生在你的情況。

第二個原因是,如果服務器以「Content-Disposition:attachment」標題響應。如上所述,當您從主機「storage.googleapis.com」獲取GCS對象時,通常不會發生這種情況,但如果您爲已上傳的對象明確指定了contentDisposition,則可能會發生這種情況。

由於這個原因,我懷疑你的一些對象沒有「image/jpeg」內容類型。你可以通過gsutil來設置它們,如下所示:gsutil -m setmeta 'Content-Type:image/jpeg' gs://myBucketName/**

+0

我檢查了所有文件都正確標記了適當的MIME類型,沒有標記爲'application-octet-stream'。此外,我確認沒有設置「Content-Disposition」值,但只是爲了矯枉過正,在服務器代碼中明確添加了一行代碼,以便在元數據中將其標記爲空。一時興起,我重複了其中一個'。 jpg'文件並將擴展名更改爲'.jpeg'。 '.jpeg'文件正確加載,而'.jpg'版本仍然下載。完全相同的文件。但其他帶'.jpg'擴展名的工作很好。 – espressoAndCode

+0

有趣。這就是使用「https://storage.googleapis.com/bucketName/imageName.jpg」或「imageName」的網址。jpeg「在瀏覽器中? –

+0

這是正確的,我剛剛運行了另一個測試,我在上傳的元數據上明確添加了'inline'的'Content-Disposition'值,我刪除了存儲中的所有文件,上面描述的'.jpeg'變體響應對象*和*雲存儲控制檯驗證mime類型和配置是否按預期設置,只是這次我得到了完全相反的行爲,'.jpeg'文件顯示在瀏覽器中,而'.jpg'版本下載令人沮喪! – espressoAndCode

相關問題