我非常需要帮助解决这个音频文件上传到云端的问题,我已经有好几天了。我多次尝试让它发挥作用,但我仍然在挣扎。我是一名后端开发新手,因此请提供任何帮助。
这是一个mp3播放器应用程序。当我上传歌曲时,标题会保存在数据库中,但Audio不会。
<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);
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;
cloudinary.uploader.upload(req.file.path, resource_type: "video", function(result)
我有和你类似的东西。
您的代码仅缺少一点修改。您需要添加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 解析的承诺 ,这就是我使用它的方式
那是因为您需要使用 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/