Vấn đề lớn hơn của tôi là tôi muốn sử dụng tính năng Kéo và Thả HTML5 để cho phép tải hình ảnh lên thùng S3 của tôi qua CORS. Tôi có thể nhận được một cái gì đó vào S3, nhưng nó luôn luôn kết thúc như những gì dường như là nội dung mã hóa base64.Làm thế nào để bạn dịch dữ liệu trong đối tượng FileReader thành dữ liệu biểu mẫu để tải lên?
myFileReader.readAsArrayBuffer(f);
//[...]
function on_onload(file_name, file_type, file_data) {
// file_name and file_type are bound to the function via a closure,
// file_data is passed in during the actual callback invocation.
var xhr = new XMLHttpRequest();
var fd = new FormData();
// code that sets AWS credentials for fd omitted
// _arrayBufferToBase64() just does a binary to base64 conversion
// as described in https://stackoverflow.com/questions/9267899/arraybuffer-to-base64-encoded-string
fd.append('file', _arrayBufferToBase64(file_data));
xhr.open('POST', my_aws_bucket_endpoint, true);
xhr.send(fd);
}
_arrayBufferToBase64()
chỉ là mã được lặp lại từ this answer.
Sau khi cố gắng để tải lên foo.jpg
:
$ wget [my_uri]/foo.jpg
[...]
HTTP request sent, awaiting response... 200 OK
Length: 295872 (289K) [image/jpeg]
Saving to: 'foo.jpg'
$ file foo.jpg
foo.jpg: ASCII text, with very long lines, with no line terminators
$ head -c 20 foo.jpg
/9j/4AAQSkZJRgABAQEA
Nếu tôi cố gắng sử dụng readAsBinaryString()
như mô tả trong this answer, và sau đó gán dữ liệu trả về để chìa khóa 'file'
, không có dữ liệu được gửi và tôi kết thúc với một số không -tập tin dài trong thùng S3 của tôi.