javascript - 无法使用 Node js将视频上传到bunny流

标签 javascript node.js reactjs axios bunnycdn

我正在尝试使用 Axios 将视频上传到带有 Node.js 的兔子流 API,但它不起作用。我应用相同的逻辑来获取、删除视频,它也适用于更改名称和更改分辨率,上传时我收到 400 个回复。在兔子流仪表板中,每次我发送请求时都会创建视频,但之后视频上传失败。请帮忙解决这个问题。

后端代码:

const upload = multer();
VideoRouter.post("/upload", upload.single("video"), uploadVideo);
export const uploadVideo = async (req, res) => {
  // console.log(req.body, req.file);

  const optionsToCreateVideo = {
    method: "POST",
    url: `http://video.bunnycdn.com/library/${process.env.VIDEO_LIBRARY_ID}/videos`,
    headers: {
      Accept: "application/json",
      "Content-Type": "application/json",
      AccessKey: process.env.BUNNY_API_KEY,
    },
    data: JSON.stringify({ title: req.body.name }),
  };

  await axios
    .request(optionsToCreateVideo)
    .then((response) => {
      const video_id = response.data.guid;

      axios
        .put(
          `http://video.bunnycdn.com/library/${process.env.VIDEO_LIBRARY_ID}/videos/${video_id}`,
          {
            headers: {
              AccessKey: process.env.BUNNY_API_KEY,
            },
            body: req.file ,
          }
        )
        .then(function (response) {
          res.status(200).json(response);
        })
        .catch(function (error) {
          // console.error("error", error);
          res.status(400).json(error);
        });
    })
    .catch((error) => {
      console.log(error.message);
      res.status(200).json({ error: "failed!" });
    });
};

处理视频上传的前端代码:

const handleVideoChange = (e) => {
    setVideo(e.target.files[0]);
  };

  const handleSubmit = () => {
    if (!videoName || videoName.trim().length === 0) {
      alert("Video Name is missing !");
      return;
    }
    if (!video) {
      alert("Video is missing !");
      return;
    }

    const form = new FormData();
    form.append("name", videoName);
    form.append("video", video);
    const config = {
      onUploadProgress: (progressEvent) => {
        const { loaded, total } = progressEvent;
        let percentage = Math.floor((loaded / total) * 100);
        console.log(percentage);
        setProgress(loaded);
      },
    };

    axios
      .post("http://localhost:4000/video/upload", form, config)
      .then((res) => console.log(res))
      .catch((err) => console.error(err));
  };

最佳答案

不要像数组或对象一样直接发送文件,而是使用 CreateReadStream 将其作为 RAW Binary 发送:

const buffer = fs.createReadStream('path-to-file');

放入 axios 的第二个参数是“body”,您必须直接将 RAW 二进制文件附加到它。

将后端代码中的 Axios 调用修改为:

axios.put(http://video.bunnycdn.com/library/${process.env.VIDEO_LIBRARY_ID}/videos/${video_id}`,
              buffer,
              {
                headers: {
                  AccessKey: process.env.BUNNY_API_KEY,
                },
              }
            )

希望它对您有帮助,我花了好几个小时才找出问题所在。

关于javascript - 无法使用 Node js将视频上传到bunny流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70504595/

相关文章:

node.js - 部署到 Heroku 的 Node 应用程序中的 git 隐私

reactjs - 从后台返回时 react native 图像消失

javascript - 如何将脚本添加到 React 组件并用作构造函数

reactjs - React-google-maps 在标记点击时传递 Prop

javascript - 使新的 stacktrace.js 库同步

javascript - 重定向到另一个页面后如何更新所选项目

node.js - 如何修复此子项目路径 : CordovaLib Error: spawn EACCES

javascript - 为什么我的带有 JSONP 脚本的 PHP/AJAX 返回 HTML、JSON 和无效的 JSON?

javascript - Jquery 验证插件 - 仅在某些情况下适用于数字字段

node.js - 错误 : not found: make