s3文件上传-不适用于视频-反应/流星-aws-sdk



我在react/metrol项目中将mp4文件上传到s3存储桶时遇到问题。它适用于其他类型的文件(mp3、图像(,但不适用于视频。我没有收到任何错误,但当我试图读取上传的文件时,它不起作用。

这是我的客户代码:

import React from "react";
import { Meteor } from "meteor/meteor";
import PropTypes from "prop-types";
import { types } from "../../../utils/constants/types";
const FileUpload = ({ fileType, type, typeId, subtype, setFileName }) => {
const handleUpload = event => {
event.preventDefault();
const file = event.target.files[0];
const fileExtension = file.type;
var reader = new FileReader();
reader.onload = function () {
Meteor.call(
"uploadFile",
fileExtension,
reader.result,
type,
typeId,
(err, result) => {
if (err) {
console.log(err);
} else {
setFileName(result);
}
}
);
};
reader.readAsDataURL(file);
};
return (
<div>
<input name="Uploader" onChange={handleUpload} type="file" />
</div>
);
};

服务器端有我的流星方法:

Meteor.methods({
uploadFile: async function (fileType, data, type, typeId) {
let extension;
let contentType = fileType;
if (fileType.includes("jpeg") || fileType.includes("jpg")) {
extension = "jpg";
} else if (fileType.includes("png")) {
extension = "png";
} else if (fileType.includes("mp4")) {
extension = "mp4";
} else if (fileType.includes("audio/mpeg")) {
contentType = "video/mp4";
extension = "mp3";
} else if (fileType.includes("pdf")) {
extension = "pdf";
} else {
throw new Meteor.Error("format-error", "Only authorized format");
}
const random = Random.id();
const key = `random.${extension}`;
const buf =
extension !== "mp4"
? Buffer.from(data.replace(/^data:image/w+;base64,/, ""), "base64")
: data;
const config = {
Bucket: bucketName,
Key: key,
Body: buf,
ContentType: contentType,
ACL: "public-read",
};
if (extension !== "mp4") {
config.ContentEncoding = "base64";
}
const uploadResult = await s3.upload(config).promise();
return uploadResult.Location;
},
});

我想这可能是因为读者没有正确管理视频文件,但我有点迷失了方向。任何意见都将不胜感激。谢谢

我想问一下,因为我看到您的代码非常复杂。为什么要通过服务器上传文件?

我认为将文件从客户端直接推送到S3更有效。如果你有兴趣了解这个概念,请看看我正在维护的这个包(https://github.com/activitree/s3up-meta)。这是对多年前经过严格测试的旧软件包的重写。上传由Meteor服务器签名,但由客户端上传。您不想让套接字/光纤忙于文件上传,同时每次上传都会有大量数据(关于上传状态的数据(。您希望所有这些都在用户/客户端上。

另一件需要注意的事情是在存储桶/管理/生命周期中设置AbortIncompleteMultipartUpload的重要性。这就是你的S3大小可能在没有控制的情况下增长的地方。

最后,当我上传视频时,我只上传文件(从输入类型文件接收(。它看起来像这样:

video: File
lastModified: 1573722339000
lastModifiedDate: Thu Nov 14 2019 13:05:39 GMT+0400 (Gulf Standard Time) {}
name: "IMG_7847.MOV"
size: 20719894
type: "video/quicktime"
webkitRelativePath: ""

我确实使用其他助手来确定文件(并限制允许上传的时间长度(和文件类型。

您可以在上传或/和激活S3端的CloudWatch时监控服务器端的错误,以查看哪里出现了故障。

最新更新