В настоящее время у меня есть небольшое приложение node.js express для загрузки изображений с использованием резких изображений и миниатюр, созданных из видео .mp4 с использованием пакета simple-thumbnail / ffmpeg.
Приложение отлично работает при загрузке изображения, файлазагружается острыми процессами, затем передает его, и он, как и ожидалось, попадает в мое ведро amazon s3.Никаких ошибок, что когда-либо.
Однако, когда я загружаю видео в формате mp4, которое я использую для создания и загрузки миниатюр, используя функцию genThumbnail () simple-thumbnails, которая использует дочерний процесс ffmpeg, миниатюра успешно загружается в мое хранилище s3 , ОДНАКО мое приложение возвращает ошибка записи EPIPE , а НЕ URL-адрес URL загруженных файлов на S3.
Что вызывает это и как это можетЯ исправляю это, учитывая, что это в значительной степени работает помимо возвращаемой ошибки EPIPE?Спасибо вперед!
Используемые пакеты:
aws-sdk
multer
multer-s3 <- этот с опцией преобразования, <strong>не стандартный пакет multer-s3
простая миниатюра
const express = require('express');
const app = express();
const aws = require('aws-sdk');
const multer = require('multer');
const multerS3 = require('multer-s3'); //github:gmenih341/multer-s3 version of multer-s3 with transform option
const sharp = require('sharp');
const genThumbnail = require('simple-thumbnail');
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Orgin, X-Requested-With, Content-Type, Accept, Authorization');
if (req.method === 'OPTIONS') {
res.header('Access-Control-Allow-Methods', 'POST');
return res.status(200).json({});
}
next();
});
let uniqueFileName;
let s3BucketName = 'bucketname';
let s3 = new aws.S3({
accessKeyId: ACCESS_KEY,
secretAccessKey: SECRET_KEY,
Bucket: s3BucketName
});
let upload = multer({
storage: multerS3({
s3: s3,
bucket: s3BucketName,
acl: 'public-read',
cacheControl: 'max-age=31536000',
contentType: multerS3.AUTO_CONTENT_TYPE,
shouldTransform: true,
transforms: [{
id: 'thumbnail',
key: function (req, file, cb) {
uniqueFileName = Date.now().toString();
cb(null, uniqueFileName + '.jpg')
},
transform: function (req, file, cb) {
if (file.mimetype == 'video/mp4') {
//When using simple-thumbnails' getThumbnail() on an mp4 video it uploads succesfully to S3 but node returns EPIPE write error
cb(null, genThumbnail(null, null, '250x?'))
} else {
//When using sharp to resize an image this works perfectly and retuns the JSON below with the files S3 URL
cb(null, sharp().jpeg())
}
}
}]
})
});
app.post('/upload', upload.array('theFile'), (req, res) => {
res.json({
fileS3Url: 'https://s3.amazonaws.com/'+ s3BucketName +'/' + uniqueFileName
});
});
app.use((req, res, next) => {
const error = new Error('Not found');
error.status = 404;
next(error);
});
app.use((error, req, res, next) => {
res.status(error.status || 500);
res.json({
error: {
message: error.message
}
});
});
module.exports = app;