Сохранение изображения, загруженного с URL-адреса (не заменяется новым) в REST API NodeJS

#node.js #rest

#node.js #rest

Вопрос:

Здесь у меня есть некоторые ресурсы о том, как создать REST API узла, который загружает изображение с заданного URL, проблема, с которой я сталкиваюсь, заключается в том, что когда я загружаю новое изображение, оно удаляет предыдущее и заменяет его. Я хочу, чтобы все загруженные изображения сохранялись в созданной папке, вот что у меня есть:

 const express = require('express');
const app = express()
const logger = require('morgan')
const bodyParser= require('body-parser')
const Fs = require ('fs');
const Path = require ('path');
const mongoose = require('mongoose');
const DB = require('./config/keys').MONGO_URI
const Pictures = require('./model/pictureSchema');
const Axios = require ('axios');
const port = process.env.PORT || 4000;

app.post('/download',async(req,res)=> {
   const {img} = req.body
    // console.log(req.body)
    const url = img
    const path = Path.join(__dirname, 'files', 'model.jpg')

    const response = await Axios({
        method: 'GET',
        url: url,
        responseType: 'stream'
    })

    response.data.pipe(Fs.createWriteStream(path))

    return new Promise ((resolve, reject) => {
        response.data.on('end', ()=>{
            resolve()
        })

        response.data.on('error', err =>{
            reject(err)
        })
    })
})
 

Исправлено с помощью @tadman:
вот отредактированный код, надеюсь, он поможет кому-то еще

 app.post('/download',async(req, res)=> {
    const {img} =req.body
    regex = new RegExp('[^.] 


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

1. Пожалуйста, полегче со ВСЕМИ ЗАГЛАВНЫМИ буквами, особенно в заголовках.

2. Заменяется ли оно, потому что у вас есть фиксированный путь для всех загрузок? Возможно, вам нужно сделать это динамичным. Вы даже можете сгенерировать его, например, UUID или что-то в этом роде.

3. Спасибо, это действительно сработало, возникла небольшая проблема с динамическим получением расширения файла, но регулярное выражение помогло с этим

)
extension = img.match(regex);
// console.log(req.body)
// console.log(extension)
if(!img){
res.json({
message: 'please input a file link'
})
}

else{
const url = img
const path = Path.resolve(__dirname, 'files', `${uuidv4()}.${extension}`)

const response = await Axios({
method: 'GET',
url: url,
responseType: 'stream'
})

response.data.pipe(Fs.createWriteStream(path))

return new Promise ((resolve, reject) => {
response.data.on('end', ()=>{
resolve()
res.status(200).json({
message:'File download successfull'
})

})

response.data.on('error', err =>{
reject(err)
res.status(400).json({
message:'File download failed'
})

})
})
}

})

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

1. Пожалуйста, полегче со ВСЕМИ ЗАГЛАВНЫМИ буквами, особенно в заголовках.

2. Заменяется ли оно, потому что у вас есть фиксированный путь для всех загрузок? Возможно, вам нужно сделать это динамичным. Вы даже можете сгенерировать его, например, UUID или что-то в этом роде.

3. Спасибо, это действительно сработало, возникла небольшая проблема с динамическим получением расширения файла, но регулярное выражение помогло с этим