【问题标题】:Failed to upload video to bunny stream with node js无法使用节点 js 将视频上传到兔子流
【发布时间】:2022-01-26 22:57:22
【问题描述】:

我正在尝试使用 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));
  };

【问题讨论】:

    标签: javascript node.js reactjs axios bunnycdn


    【解决方案1】:

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

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

    put in 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,
                    },
                  }
                )
    

    希望它对您有所帮助,我花了好几个小时才弄清楚出了什么问题。

    【讨论】:

    • 感谢您的回复,我正在尝试这样做,但我收到了 401 回复。 axios.put(video.bunnycdn.com/library/${process.env.VIDEO_LIBRARY_ID}/videos/${video_id}, buffer, { headers: { AccessKey: process.env.BUNNY_API_KEY, }, maxBodyLength: Infinity, } );
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 2016-12-15
    • 2015-07-09
    • 2014-11-06
    • 2014-03-06
    相关资源
    最近更新 更多