2017-08-29 73 views
1

我正在通過s3.upload方法將我的nodejs服務器的JSON字符串上傳到S3。如何使用node.js保存S3文件中的表情符號

var s3 = new AWS.S3(); 

s3.upload({ 
    Bucket: myBucket, 
    Key: 'myPath/' + thing.id + '.json', 
    Body: JSON.stringify(thing), 
    ContentType: 'application/json' 
}) 

如果在上面的代碼片段中,thing對象具有包含表情符號的字符串屬性,我怎麼會修改這個操作,以保持表情符號字符。

在我的節點服務器上,我可以看到表情符號存儲在數據庫中並正確提供。只有在上傳之後,角色纔會失去其完整性。我認爲有一些字符編碼技巧可以應用於JSON.stringify結果,但我還不知道細節。在這裏尋求幫助。

JSON我會在節點服務器:

enter image description here

JSON我看到S3:

enter image description here

+0

什麼是 「示例JSON在S3:」 是什麼意思?它看起來像相同的字符串,只是解釋不正確。那麼,在第二個屏幕截圖上解釋它是什麼。 – zerkms

+0

該示例通過瀏覽器顯示我在nodejs服務器和S3中看到的內容。 –

+0

那麼實際問題是什麼?您是否嘗試從S3中檢索數據並比較字節?目前還不清楚你已經做了什麼來確認問題,甚至存在。 – zerkms

回答

3

正如zerkms所述,來自S3的文件中的字節與節點服務器的文件相同。問題是S3的Web客戶端在S3打開JSON文件時沒有告訴瀏覽器使用uft-8。因此,Chrome以屏幕截圖顯示的方式顯示了字節。

這是真的很好,但它並沒有幫助解決原始的期望結果,即從S3網絡客戶端看到表情符號。

此修復程序是添加charset=utf-8到s3.upload選項,就像這樣:

s3.upload({ 
    Bucket: myBucket, 
    Key: 'myPath/' + thing.id + '.json', 
    Body: JSON.stringify(thing), 
    ContentType: 'application/json;charset=utf-8' 
}) 

此外,值得什麼,設定ContentEncoding: 'utf-8'沒有產生期望的行爲。

+1

'utf-8'是*字符*編碼,而不是*內容*編碼。 *「Content-Encoding」標頭字段指示除了在媒體類型中固有的那些內容編碼 已被應用於表示之外什麼內容編碼......內容編碼值指示應用於表示的編碼轉換......內容編碼 主要用於允許壓縮或轉換表示,而不會丟失其基礎媒體類型的身份並且不會丟失信息。「* - [RFC-7232](https://tools.ietf.org /html/rfc7231#section-3.1.2.1)。最常見的是'gzip'。 –

1

有在這個情況下,沒有真正的問題:數據被正確上傳,它只是S3不提供編碼(它根本不知道它),谷歌瀏覽器沒有足夠的上下文來猜測它是正確的。

0

櫃面有人需要通過AWS CLI來做到這一點:

aws s3 sync ./build s3://your-s3-bucket --exclude "*.js"

定期上傳所有build文件夾中的文件,但其中包含UTF-8表情符JS

然後

aws s3 sync --content-type "text/html; charset=utf-8" ./build s3://your-s3-bucket --exclude "*" --include "*.js"

包含UTF-8字符表情符號使用UTF-8編碼上傳js文件

*注:選項順序是非常重要的AWS-CLI

相關問題