如何实现 dropzone.js 上传文件到 Amazon s3 服务器?
How to implement dropzone.js to upload file into Amazon s3 server?
请帮助实施 dropzone.js 将文件上传到 Amazon s3 服务器。已经参考了以下link https://github.com/enyo/dropzone/issues/33,但是,没有实现的想法。请帮助实施相同的。需要任何 dropzone 配置代码。
对于可能也跳进这个问题的人,我想分享我的工作场景(无服务器与 AWS Lambda)。
注意:完整示例可以在我的Vue S3 Dropzone component中找到,与 Dropzone 和 S3 相关的代码实际上与框架无关。
所以,基本上,
- 客户端(浏览器)调用 AWS Lambda 函数为每个添加的文件获取预签名上传 URL。
- 当预签名URL响应返回时,客户端会立即触发
dropzone.processFile
。
- 在处理文件时,相应地为文件更改
dropzone.options.url
。
提示:
- 因为我要签署 PUT 可上传 URL,所以我要 hijack
xhr.send
函数,否则Dropzone 将始终在 formData 中发送文件,这不利于 PUT 上传。
最终客户端代码
// In the `accept` function we request a signed upload URL when a file being accepted
accept (file, done) {
lambda.getSignedURL(file)
.then((url) => {
file.uploadURL = url
done()
// And process each file immediately
setTimeout(() => dropzone.processFile(file))
})
.catch((err) => {
done('Failed to get an S3 signed upload URL', err)
})
}
// Set signed upload URL for each file being processing
dropzone.on('processing', (file) => {
dropzone.options.url = file.uploadURL
})
最终的 AWS Lambda 代码
var AWS = require('aws-sdk')
var s3 = new AWS.S3();
// Make sure you set this env variable correctly
var bucketName = process.env.AWS_BUCKET_NAME
exports.handler = (event, context) => {
if (!event.hasOwnProperty('contentType')) {
context.fail({ err: 'Missing contentType' })
}
if (!event.hasOwnProperty('filePath')) {
context.fail({ err: 'Missing filePath' })
}
var params = {
Bucket: bucketName,
Key: event.filePath,
Expires: 3600,
ContentType: event.contentType
}
s3.getSignedUrl('putObject', params, (err, url) => {
if (err) {
context.fail({ err })
} else {
context.succeed({ url })
}
})
}
演示
请帮助实施 dropzone.js 将文件上传到 Amazon s3 服务器。已经参考了以下link https://github.com/enyo/dropzone/issues/33,但是,没有实现的想法。请帮助实施相同的。需要任何 dropzone 配置代码。
对于可能也跳进这个问题的人,我想分享我的工作场景(无服务器与 AWS Lambda)。
注意:完整示例可以在我的Vue S3 Dropzone component中找到,与 Dropzone 和 S3 相关的代码实际上与框架无关。
所以,基本上,
- 客户端(浏览器)调用 AWS Lambda 函数为每个添加的文件获取预签名上传 URL。
- 当预签名URL响应返回时,客户端会立即触发
dropzone.processFile
。 - 在处理文件时,相应地为文件更改
dropzone.options.url
。
提示:
- 因为我要签署 PUT 可上传 URL,所以我要 hijack
xhr.send
函数,否则Dropzone 将始终在 formData 中发送文件,这不利于 PUT 上传。
最终客户端代码
// In the `accept` function we request a signed upload URL when a file being accepted
accept (file, done) {
lambda.getSignedURL(file)
.then((url) => {
file.uploadURL = url
done()
// And process each file immediately
setTimeout(() => dropzone.processFile(file))
})
.catch((err) => {
done('Failed to get an S3 signed upload URL', err)
})
}
// Set signed upload URL for each file being processing
dropzone.on('processing', (file) => {
dropzone.options.url = file.uploadURL
})
最终的 AWS Lambda 代码
var AWS = require('aws-sdk')
var s3 = new AWS.S3();
// Make sure you set this env variable correctly
var bucketName = process.env.AWS_BUCKET_NAME
exports.handler = (event, context) => {
if (!event.hasOwnProperty('contentType')) {
context.fail({ err: 'Missing contentType' })
}
if (!event.hasOwnProperty('filePath')) {
context.fail({ err: 'Missing filePath' })
}
var params = {
Bucket: bucketName,
Key: event.filePath,
Expires: 3600,
ContentType: event.contentType
}
s3.getSignedUrl('putObject', params, (err, url) => {
if (err) {
context.fail({ err })
} else {
context.succeed({ url })
}
})
}