Sharp error: [Error: Input file is missing]

Sharp error: [Error: Input file is missing]

我通过request下载图片,然后通过sharp处理图片。 但是出现输入文件丢失的错误,其实变量body是有值的。

import { IADLandingPageABTest } from '@byted/ec-types';
import request from 'request';
import sharp from 'sharp';

const images: Array<keyof IADLandingPageABTest> = ['topPosterUrl', 'bottomPosterUrl'];

export default function handleImage (config: IADLandingPageABTest) {
    images.forEach(key => {
        const url = config[key];
        if (url && typeof url === 'string' ) {
           request(url, (err, response, body) => {
               //console.log('body', body);
               //body has a value
               if (!err && response.statusCode === 200) {
                sharp(body)
                .resize(100)
                .toBuffer()
                .then((data) => {
                    console.log(data.toString('base64'));
                })
                .catch( err => { console.log('error', err) });
               }
           })
        }
    });
}

我在 sharp 存储库中发现了一个概述了解决方案的问题:

the request module expects encoding to be set to receive body as a Buffer.

- request(url, function(error, response, body) {
+ request({ url, encoding: null }, function(error, response, body) {

来源:https://github.com/lovell/sharp/issues/930#issuecomment-326833522

我想指出我做的错误!

如果您使用的 multer 库在 运行 之后将缓冲区保留在 req.file,那么请确保 file/buffer在尖锐的内部传递是 正确。

下面是我使用的代码,我确实遇到了问题中提到的相同错误。(我使用 multer 进行文件上传)

 sharp(req.file)
 .resize({ width: 75,height: 75 })
 .toBuffer()
 .then(data => {
   console.log("data: ",data);
   res.send("File uploaded");
 }).catch(err =>{
  console.log("err: ",err);    
 });

req.file是一个对象!

req.file:  {
fieldname: 'file',
originalname: 'Sample.gif',
encoding: '7bit',
mimetype: 'image/gif',
buffer: <Buffer 47 49 46 38 39 61 57 04 56 02 f7 00 31 00 ff 00 09 73 22 0c 76 
14 33 23 ... 797643 more bytes>,
size: 797693
} 

我已经通过了 req.file 这反过来是一个不是文件的对象 exactly.Rather 里面的缓冲区属性 req.file 是我的实际文件缓冲区 需要在 sharp

内给出

所以通过使用下面的代码,我没有遇到任何错误并且我的代码有效!

 sharp(req.file.buffer)
 .resize({ width: 75,height: 75 })
 .toBuffer()
 .then(data => {
   console.log("data: ",data);
   res.send("File uploaded");
 }).catch(err =>{
  console.log("err: ",err);    
 });