如何使用 Node.js 将音频文件上传到 Cloudinary?

问题描述 投票:0回答:3

我非常需要帮助解决这个音频文件上传到云端的问题,我已经有好几天了。我多次尝试让它发挥作用,但我仍然在挣扎。我是一名后端开发新手,因此请提供任何帮助。

这是一个mp3播放器应用程序。当我上传歌曲时,标题会保存在数据库中,但Audio不会。

This is the MP3 PLAYER page screenshot. It shows the title being saved and rendered from DB but not the audio file.

音频上传表格

   <form class="ui form" action="/albums/<%= album._id %>/songs" method="POST" enctype="multipart/form-data">
            <div class="field">
                <label>Song Title:</label>
                <input type="text" id="title" name="song[title]" placeholder="song title...." required>
            </div>
            <div class="field">
                <label>Song file:</label>
                <input type="file" id="song" name="audio" accept="audio/*" required>
            </div>
            <div class="field">
                <input class="fluid ui green button" type="submit" id="submit" value="Enter">
            </div>
            <a href="/albums/<%= album._id %>" class="ui small orange button exit-btn">Exit</a>
     </form>

歌曲模型

var mongoose = require("mongoose");

//Album Schema
var audioSchema = new mongoose.Schema({
   title: String,
   audio: String,
   date: {type: Date, default: Date.now()}

});

//exporting the Schema
module.exports = mongoose.model("Audio", audioSchema);

后端代码/ROUTE

var express             = require("express"),
    router              = express.Router({mergeParams: true}),
    middleware          = require("../middleware"),
    Album               = require("../models/album"),
    Song                = require("../models/songs"),
    multer              = require("multer")

var storage = multer.diskStorage({
  filename: function(req, file, callback) {
    callback(null, Date.now() + file.originalname);
  }
});
//uploader
var upload = multer({ storage: storage});
var cloudinary = require('cloudinary');
cloudinary.config({ 
   cloud_name: 'proccess.env.CLOUDINARY_NAME',
   api_key: process.env.CLOUDINARY_API_KEY, 
   api_secret: process.env.CLOUDINARY_API_SECRET
});

//Songs new Route
router.get("/albums/:id/songs/new", middleware.isLoggedIn, function(req, res) {
  //find Album by id
  Album.findById(req.params.id, function(err, album) {
      if(err) {
          console.log(err);
      } else {
          res.render("songs/new", {album: album});
      }
  });
});
//Song POST route
router.post("/albums/:id/songs", middleware.isLoggedIn, upload.single("audio"), function(req, res) {
    cloudinary.uploader.upload(req.file.path, function(result) {
        // add cloudinary url for the mp3 to the album object under audio property
        req.body.song.audio = result.secure_url;
        //find Album by ID
        Album.findById(req.params.id, function(err, album) {
            if(err) {
                console.log(err);
                res.redirect("/albums/" + req.params.id);
            } else {

                //Creating Album and saving it to DB
                Song.create(req.body.song, function(err, song) {
                    if(err) {
                        console.log("Opps something went wrong!" + err);
                        res.redirect("back");
                    } else {
                        //save the song to DB
                        song.save();
                        //this saves the songs object inside 
                        album.songs.push(song);
                        //save album
                        album.save();
                        res.redirect("/albums/" + album._id);
                    }
                });

            }

        });
    });    

});


module.exports = router;
html node.js mongodb express mongoose
3个回答
0
投票
  cloudinary.uploader.upload(req.file.path,  resource_type: "video", function(result)

0
投票

我有和你类似的东西。

您的代码仅缺少一点修改。您需要添加UploadApiOption:

{ resource_type: "video" };
作为上传函数的第二个参数。

我知道这是音频,但“视频”选项也适用于音频。它对我有用。

截至 2024 年 4 月 12 日,唯一可用的选项是

"auto" | "image" | "raw" | "video"

您的上传代码应如下所示。

cloudinary.uploader.upload(
   req.file.path,
   { resource_type: "video" }, // add this line
   function(result) {
        req.body.song.audio = result.secure_url;
       //...
       // ...etc you can now extract the secure_url from result
   }
);

这是我的代码。 我创建了一个 CloudinaryService 类,它有一个 uploadAudio 方法,该方法从 multer 中间件接收文件并返回一个使用 URL 解析的承诺 photo of CloudinaryService Class,这就是我使用它的方式 using it in my audioController


-1
投票

那是因为您需要使用 MongoDB 中的 GridFS 来存储文件中的数据。 https://docs.mongodb.com/manual/core/gridfs/#use-gridfs

当您使用 Mongoose 时,请检查此模块:https://www.npmjs.com/package/mongoose-gridfs

mongoose-gridfs 模块包装了 gridfs-stream 模块,似乎适合二进制数据上传。如果您愿意,您仍然可以按照本教程自行操作:http://niralar.com/mongodb-gridfs-using-mongoose-on-nodejs/

© www.soinside.com 2019 - 2024. All rights reserved.