Мне нужно получить ссылку и сохранить изображение в статической папке.
Вот что я сделал
@Injectable()
export class FilesService {
createFileFromUrl(url: string) {
try {
const fileName = uuid.v4() + '.jpg';
const filePath = path.resolve(__dirname, '..', 'static');
axios({
url,
responseType: 'stream',
}).then(
(response) =>
new Promise<void>((resolve, reject) => {
response.data
.pipe(fs.createWriteStream(filePath))
.on('finish', () => resolve())
.on('error', (e) => reject(e));
}),
);
return fileName;
} catch (e) {
throw new HttpException(
'Произошла ошибка при записи файла',
HttpStatus.INTERNAL_SERVER_ERROR,
);
}
}
}
Это не так? я не понимаю почему
Я использую эту функцию в контроллере
Я не понимаю, как работает эта функция, она не возвращает обещание.
Как можно сделать функционал: получить и сохранить изображение по url в статической папке.
Нет, это не работает!
Ну как "не работает" Ошибки выдает? Вы получаете неверные данные? Каков текущий функционал и что желательно?
filePath — это путь к каталогу статических файлов, а не путь к самому файлу. Я полагаю, вы забыли добавить fileName в конце вызова к path.resolve?
Возможно, аксиос работает неправильно, или я не понимаю, как работают аксиомы.
@Jay McDoniel, при отправке запроса я получаю перехват вызова. Мне нужно получить изображение по URL-адресу и поместить его в статическую папку, а из службы вернуть имя файла.
https.get(url, (res) => { const fileStream = fs.createWriteStream(filePath); res.pipe(fileStream); fileStream.on('finish', () => { fileStream.close(); console.info('done'); }); });Здесь было бы полезно указать ошибку, которую вы получаете как часть своего вопроса.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вот решение. Надеюсь, это поможет.
import * as https from 'https';
import * as fs from 'fs';
const download = function (url, dest, cb) {
const file = fs.createWriteStream(dest);
https
.get(url, function (response) {
response.pipe(file);
file.on('finish', function () {
file.close(cb); // close() is async, call cb after close completes.
});
})
.on('error', function (err) {
// Handle errors
fs.unlink(dest, cb(err.message)); // Delete the file async. (But we don't check the result)
});
};
download(
'https://img.freepik.com/free-vector/sketchy-sport-balls_1010-37.jpg?w=740&t=st=1668149007~exp=1668149607~hmac=9a00e87ed9d1e646e1faea885ee27826e99281da76f52f372f0b4dda048ee648',
join(process.cwd(), '..', 'static', 'sketchy-sport-balls.jpg'),
function () {
console.info('File downloaded');
},
);
Измените его в соответствии с вашими требованиями, если хотите
Ну, это работает для вас? Делать это «правильно» субъективно, но если это работает, то это работает, верно?