【发布时间】:2021-01-07 10:13:22
【问题描述】:
我在我的 react/meteor 项目中将 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方法:
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;
},
});
我认为这可能是因为读者没有正确管理视频文件,但我有点迷路了。任何输入将不胜感激。谢谢。
【问题讨论】:
-
文件不存在还是内容不好?
-
内容显然很糟糕。这应该是一个 4 秒的视频,但我什么也得不到(0 秒)
-
你确定
onload回调在你认为的时候被触发了吗?如果你只是在加载数据后手动调用uploadFile会发生什么? -
如前所述,代码适用于图像和 mp3,只是 mp4 无法正常工作。
-
@Exelian 我也可以使用 wget 获取文件,它的大小是正常的,但可以在本地播放。
标签: node.js reactjs amazon-s3 meteor aws-sdk