Multer没有将文件保存为文件

时间:2016-08-04 14:57:51

标签: node.js multer

我已将multer设置为路由中的中间件。当该路由被命中时,multer不会下载该文件。这就是console.log报告的内容:

{ firstname: 'foo',
  lastname: 'foo',
  username: 'foo10',
  password: 'test1234',
  file: '/9j/4AAQSkZJRgABAQAASABIAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAAB.....

}

我为multer设置了以下设置:

var storage = multer.diskStorage({
  destination: function(req, file, cb) {
    cb(null,  '../images/profile');
  },
  filename: function(req, file, cb) {
    cb(null, req.body.username + '.jpeg');
  }
});

var upload = multer({storage: storage});

router.post('/auth/signup', upload.single('file'), function(req,res) {
  console.log(req.body);
});

所以问题是,不是将文件保存为文件,而是将其视为表单中的另一个键值对。

为了进一步澄清,我从cordova API获取此图像: http://ionicframework.com/docs/v2/native/camera/

import { Camera } from 'ionic-native';

Camera.getPicture(options).then((imageData) => {
 // imageData is either a base64 encoded string or a file URI
 // If it's base64:
   let base64Image = 'data:image/jpeg;base64,' + imageData;

   let formData: FormData = new FormData(),
        xhr: XMLHttpRequest = new XMLHttpRequest();     
        formData.append("file", base64Image);

        xhr.onreadystatechange = () => {
          if (xhr.readyState === 4) {
            if (xhr.status === 200) {
                observer.next(JSON.parse(xhr.response));
                observer.complete();
            } else {
                observer.error(xhr.response);
            }
          }
        };
      xhr.open('POST', 'http://localhost:8080/auth/signup', true);
      xhr.send(formData); 

}, (err) => {
 // Handle error
});

1 个答案:

答案 0 :(得分:0)

文件数据正在作为Base64字符串上传,这表明它未被上传为正确的File表单数据字段。这就是multer将其视为常规字段的原因,并且不会尝试将其保存到文件中。

this answer中,会出现一些客户端代码,以便将数据URI字符串(如base64Image)处理为正确的格式,以便上传到服务器。