Javascript AWS S3上的文件在使用预先签名的URL上载后文件中有额外信息

Javascript AWS S3上的文件在使用预先签名的URL上载后文件中有额外信息,javascript,node.js,reactjs,amazon-s3,Javascript,Node.js,Reactjs,Amazon S3,我正在尝试使用预先签名的url将文件直接上传到S3 bucket 下面是node.js中编写的服务器端代码,它成功创建了签名url const s3 = new AWS.S3({ accessKeyId: config.accessKeyId, secretAccessKey: config.secretAccessKey, region: config.awsConfig.region }); const signedUrlExpireSeconds = 60 * 6

我正在尝试使用预先签名的url将文件直接上传到S3 bucket

下面是node.js中编写的服务器端代码,它成功创建了签名url

const s3 = new AWS.S3({
    accessKeyId: config.accessKeyId,
    secretAccessKey:  config.secretAccessKey,
    region: config.awsConfig.region
});
const signedUrlExpireSeconds = 60 * 60;
let mimeType = "video/mp4";

const filename =Date.now();

const Key = `${filename}.mp4`;

const params = {
    Bucket: config.awsConfig.aws_upload_bucket, 
    Key: Key,
    Expires: signedUrlExpireSeconds,
    ACL: 'public-read',
    ContentType: mimeType
    };

s3.getSignedUrl('putObject', params, function (err, url) {
    if (err) {
        console.log('Error getting presigned url from AWS S3');
        res.json({ success: false, message: 'Pre-Signed URL error', urls: fileurls });
    }
    else {
        console.log('Presigned URL: ', url);
        res.json({ success: true, message: 'AWS SDK S3 Pre-signed urls generated successfully.', url: url, Key:Key, ContentType: mimeType  });
    }
});
下面是最后编写的代码

const DropzoneArea = props => {
    const [files, setFiles] = useState([]);
    let awsFile = '';

    const onUploadHandler = files => {
        if (files.length === 0) {
            console.log('Debug : [components DropzoneArea onUploadHandler] files => ', files);
            return;
        }
        awsFile = files[0]
        // calling the API to get presigned url.
        getPreSignedURL(files[0].type,S3preSignedURLCallback)        
    };

    const S3preSignedURLCallback = videoData => {
        const xhr = new XMLHttpRequest();
        xhr.open('PUT', videoData.url);
        xhr.setRequestHeader('Content-Type', videoData.ContentType);
        var res = new FormData();
        res.append('file', awsFile);
        xhr.send(res);
    };
}
使用上述代码,文件成功上传到s3,但视频无法播放。所以我比较了S3上的文件和我上传的实际文件。我发现很少有额外的请求数据也写在S3文件中。


我在这里犯了一个小错误,找不到bug。请帮忙

不要使用
formData
,直接发送文件即可

const S3preSignedURLCallback = videoData => {
        const xhr = new XMLHttpRequest();
        xhr.open('PUT', videoData.url);
        xhr.setRequestHeader('Content-Type', videoData.ContentType);
        // Send the binary data.
        // Since a File is a Blob, you can send it directly.
        xmlHttpRequest.send(awsFile);
};
您看到的区别是,AWS正在保存原始请求,而没有对其进行解析,您可以看到正确的图像是一个多部分/表单数据请求