【发布时间】:2018-03-08 09:07:04
【问题描述】:
我正在尝试使用 JS SDK 从浏览器上传多部分 s3。我对createMultipartUpload 没有任何问题,但是我没有从uploadPart 得到任何数据。我无法调用 completeMultipartUpload,因为我没有取回任何 eTag。我只得到对象的 $response 部分,它表示 200 状态,并且我传递的所有参数都已定义和正确的数据类型。我看不到存储桶中的任何零件,尽管我不知道它们是否会进入我无法访问的特殊“零件”位置。
这是我的代码:
const createParams = {
Bucket,
Key: `${uuid()}.${getExtension(file.type)}`,
ContentType: file.type,
ContentDisposition: 'attachment'
}
return s3.createMultipartUpload(createParams).promise()
.then(result => {
console.log(result);
console.log('chunking...')
let chunkArr = chunker(file);
let chunkMap = Promise.map(chunkArr, (chunk, index) => {
const chunkParams = {
Body: chunk,
Bucket: result.Bucket,
Key: result.Key,
PartNumber: index + 1,
UploadId: result.UploadId,
ContentLength: chunk.size
}
console.log(chunkParams)
return s3.uploadPart(chunkParams).promise();
});
return Promise.all(chunkMap);
})
.then(result => {
console.log(result);
return Promise.resolve(true)
// let stopParams = {
//
// }
// return s3.completeMultipartUpload(stopParams).promise();
})
.catch(err => {
throw err;
return Promise.reject(err);
});
s3 实例如下所示:
import AWS from 'aws-sdk';
AWS.config.setPromisesDependency(Promise);
const s3 = new AWS.S3({
apiVersion: '2006-03-01',
accessKeyId: credentials.credentials.AccessKeyId,
secretAccessKey: credentials.credentials.SecretAccessKey,
sessionToken: credentials.credentials.SessionToken,
sslEnabled: true,
s3ForcePathStyle: true,
httpOptions: {
xhrAsync: true,
xhrWithCredentials: true
}
})
chunker 函数如下所示:
const chunkFile = (file) => {
console.log(typeof(file));
const fileSize = file.size;
const chunkSize = 5242881; // bytes
let offset = 0;
let chunkArr = [];
const chunkReaderBlock = (_offset, _file) => {
console.log(_offset);
if (_offset >= fileSize) {
console.log("Done reading file");
return chunkArr;
}
let blob = _file.slice(_offset, chunkSize + _offset);
console.log(blob);
console.log(typeof(blob));
chunkArr.push(blob);
return chunkReaderBlock(chunkSize + _offset, _file);
}
return chunkReaderBlock(offset, file);
}
我返回的响应对象如下所示:
(2)[{…}, {…}]
0: {
$response: Response
}
1: $response: Response
cfId: undefined
data: {
$response: Response
}
error: null
extendedRequestId: undefined
httpResponse: HttpResponse
body: Uint8Array[]
headers: {}
statusCode: 200
statusMessage: "OK"
stream: EventEmitter {
_events: {…},
_maxListeners: undefined,
statusCode: 200,
headers: {…}
}
streaming: false
_abortCallback: ƒ callNextListener(err) __proto__: Object
maxRedirects: 10
maxRetries: 3
redirectCount: 0
request: Request {
domain: undefined,
service: f… s.constructor,
operation: "uploadPart",
params: {…},
httpRequest: HttpRequest,
…
}
retryCount: 0
__proto__: Object
__proto__: Object
length: 2
__proto__: Array(0)
有什么想法吗?这是在 React 中,我的测试文件是 9.xx MB。我也尝试了回调,一次上传一个部分,得到了同样的结果。
【问题讨论】:
-
您的存储桶的 CORS 配置是否包含
<ExposeHeader>ETag</ExposeHeader>之类的内容? "ExposeHeader— Identifies the response headers ... that customers will be able to access from their applications (for example, from a JavaScript XMLHttpRequest object)." -
没有!这就是问题所在。您必须公开该标头而不是其他标头,这似乎很奇怪;我希望在文档中链接到 uploadPart 方法。如果你会回答,我会标记它是正确的。
标签: javascript amazon-s3