Как преобразовать видеофайл, загруженный с помощью multer, в строку, чтобы я мог отобразить его на интерфейсе

#javascript #html #node.js

Вопрос:

Я пытаюсь загрузить видеофайл на страницу интерфейса, но он не работает. ниже приведен код. Пожалуйста, дайте мне знать, в чем дело, потому что я продолжаю получать сообщение об ошибке, приведенное к строке не удалось для значения в учебнике по пути. это схема модели

 //this is the model schema
var mongoose = require("mongoose");

var courseSchema = new mongoose.Schema({
    name: String,
    course: String,
    createdAt: {
        type: Date,
        default: Date.now
    },
    tutorial: String,
    price: String,
    description: String,
    author: {
        id: {
            type: mongoose.Schema.Types.ObjectId,
            ref: "User",
        },
        username: String
    },
    comments: [
        {
            type: mongoose.Schema.Types.ObjectId,
            ref: "Comment"
        }
    ]
});

module.exports = mongoose.model("Course", courseSchema);
 

это почтовый маршрут

  //this is the route
    router.post("/", upload.single("tutorial"), function(req, res, next){
        //get data from the form and add it to the course array
        var name        = req.body.name;
        var course      = req.body.course;
        var tutorial    = req.file;
        var price       = req.body.price;
        var description = req.body.description;
        var author = {
            id: req.user._id,
            username: req.user.username
        };
        var newCourse = {name: name, course: course, tutorial: tutorial, price:price, description: description, author: author}
        //Create a new course and save to the database
        Course.create(newCourse, function(err, newlyCreated){
            if(err){
                console.log(err)
            } else {
                //redirect it page back to the courses page
                res.redirect("courses/"   req.body.course);
            }
        });    
    });
 

это передняя часть.

 //this is the frontend
<div class="row container">
                <!-- blog grid -->
                <% courses.forEach(function(course){ %>
                <div class="col-lg-4 col-md-6">
                    <div class="card">
                        <div class="card-header p-0 position-relative">
                            <a href="/courses/<%- course._id %>">
                                <video class="card-img-bottom" src="${req.file.path}" alt="course" controls></video>
                                <span class="post-icon" aria-hidden="true">

lt;%- course.price %></span>
</a>
</div>
<div class="card-body">
<h6 class="text-colors let-spa mb-3"></h6>
<h5 class="blog-title card-title font-weight-bold text-bl"><%- course.name %></h5>
<div class="row mt-5">
<div class="col-3 testi-img-res px-2">
<img src="/images/te1.jpg" alt=" " class="img-fluid rounded-circle" />
</div>
<div class="col-9 w3_testi_grid mt-xl-2 mt-lg-0 mt-md-2 mt-4">
<h5 class="text-colors mb-1"><%- course.author.username %></h5>
<p>Good day Programmers</p>
</div>
</div>
</div>
</div>
</div>
<% }); %>
<!-- //blog grid -->
</div>

Он просто продолжает возвращать это

     Error: Course validation failed: tutorial: Cast to string failed for value "{
      fieldname: 'tutorial',
      originalname: 'name of the file',
      encoding: '7bit',
      mimetype: 'video/mp4',
      destination: 'public/course_uploads',
      filename: '1626194886684.mp4',
      path: 'public\course_uploads\1626194886684.mp4',
      size: 32510498
    }" at path "tutorial"
{
      stringValue: '"{n'  
        "  fieldname: 'tutorial',n"  
        "  originalname: '09. Navigation Bar and Menu in CSS.mp4',n"  
        "  encoding: '7bit',n"  
        "  mimetype: 'video/mp4',n"  
        "  destination: 'public/course_uploads',n"  
        "  filename: '1626194886684.mp4',n"  
        "  path: 'public\\course_uploads\\1626194886684.mp4',n"  
        '  size: 32510498n'  
        '}"',
      messageFormat: undefined,
      kind: 'string',
      value: [Object],
      path: 'tutorial',
      reason: null
    }
  },
  _message: 'Course validation failed'
}
 

Комментарии:

1. вы должны сохранить свой файл в своем бэкэнде. и сохраните путь к файлу в своей базе данных.

2. именно так он загружается в папку загрузки курса, и в базе данных он хранится как «public/course_uploads/filename» или он должен храниться с корневым путем?

Ответ №1:

создайте /загрузите файл в бэкэнд ur.

не забудьте использовать его путь к файлу в ur index.js

 app.use('/videos', express.static('/uploads))
 

Я использовал /видео в качестве префикса

затем сохраните файл и назовите его, используя его имя поля и исходное имя из multer:

 ${file.fieldname}${path.extname(file.originalname)}
 

В вашей базе данных сохраните его как : http://localhost:5000/videos/${req.file.filename}

Используя этот URL-адрес, вы можете использовать доступ к видео в интерфейсе.

Комментарии:

1. github.com/RUPAAK/MERN_FILEUPLOAD_CODE/blob/master/server/… воздержитесь от этого кода

2. Тогда как мне вызвать интерфейс, используя src=’ ‘

3. в интерфейсе ur вы можете использовать URL-адрес, который хранится в базе данных. т. е. локальный хост:5000/видео/$ {req.файл. имя файла} в этом случае

4. ОК. Но сработает ли это, если я загружу сайт на свой хост? В этом-то и проблема

5. да, измените инициалы, например: вместо локального хоста:5000 …. используйте urhost.com ……