我在地區BUCKET_REGION
上有一個名爲BUCKET
的S3存儲桶。我試圖讓我的網絡和移動應用的用戶上傳圖片文件到這些存儲區,只要他們符合基於Content-Type
和Content-Length
(即,我只允許上傳小於3mb的jpegs)的某些限制。一旦上傳,這些文件應該公開訪問。允許用戶上傳內容到s3
基於相當廣泛通過AWS文檔挖,我認爲這個過程應該是這個樣子對我的前端應用程序:
const a = await axios.post('my-api.com/get_s3_id');
const b = await axios.put(`https://{BUCKET}.amazonaws.com/{a.id}`, {
// ??
headersForAuth: a.headersFromAuth,
file: myFileFromSomewhere // i.e. HTML5 File() object
});
// now can do things like <img src={`https://{BUCKET}.amazonaws.com/{a.id}`} />
// UNLESS the file is over 3mb or not an image/jpeg, in which case I want it to be throwing errors
哪裏對我的後端API我會做這樣的事情
import aws from 'aws-sdk';
import uuid from 'uuid';
app.post('/get_s3_id', (req, res, next) => {
// do some validation of request (i.e. checking user Ids)
const s3 = new aws.S3({region: BUCKET_REGION});
const id = uuid.v4();
// TODO do something with s3 to make it possible for anyone to upload pictures under 3mbs that have the s3 key === id
res.json({id, additionalAWSHeaders});
});
我不確定的是我應該看到什麼確切的S3方法。
這裏有一些事情不工作:
我已經看到了很多的提到與
s3.getSignedUrl('putObject', ...)
訪問(一個很舊的)API的。但是,這似乎並不支持可靠地設置ContentLength
- 至少已經有了。 (請參閱https://stackoverflow.com/a/28699269/251162。)我也見過一個更貼近實際的例子,使用
HTTP POST
和form-data
API,這也是非常古老的。我想如果沒有其他選擇,這可能會完成,但我擔心它不再是「正確」的做事方式 - 此外,它似乎做了大量的手動加密等,而不是使用官方節點SDK。 (見https://stackoverflow.com/a/28638155/251162。)
可以確保您的S3存儲連接到它正確的策略:如何簽訂使用標準封裝的NodeJS政策完整的示例。它需要公開。 – LostJon