【发布时间】:2020-10-02 15:23:38
【问题描述】:
我正在尝试使用 multer 将图像上传到 NodeJS 服务器,并按照以下示例为 React Native 应用程序表达: https://github.com/expo/image-upload-example/blob/master/backend/index.js
但它似乎不起作用,我真的不知道为什么...... 我正在使用 axios 处理 http 请求。
客户端:
const uriParts = image.split('.'); //image is the uri
const fileType = uriParts[uriParts.length - 1];
const formData = new FormData();
formData.append('photo', {
image,
name: `photo.${fileType}`,
type: `image/${fileType}`,
});
axios.post(`${Utils.userServerUrl}/edit_profile`, { formData })
.then((response) => {
setLoading(false);
console.log(`response : ${response}`);
})
.catch((err) => console.log(err));
服务器端:
const multer = require('multer');
const storage = multer.diskStorage({
destination: function (req, file, cb) {
console.log(req.body.name)
cb(null, 'profile_imgs/')
},
filename: function (req, file, cb) {
cb(null, file.fieldname)
}
});
const upload = multer({ storage: storage });
router.post('/', upload.single('photo'), (req, res) => {
const {formData} = req.body;
console.log(formData);
if(!req.file) console.log('no files uploaded');
else console.log('file uploaded!');
})
我已经尝试添加这些选项:
let options = {
method: 'POST',
body: formData,
headers: {
Accept: 'application/json',
'Content-Type': 'multipart/form-data',
},
};
到 axios 方法,但我得到一个 错误:未找到多部分边界
如果有人可以帮助我,我会很高兴...谢谢
[编辑] 解决方案:
苦苦挣扎了一阵子终于找到了解决办法,如果有人感兴趣的话。
客户端:
function uploadImageAsync(uri) {
const serverUrl = `${Utils.userServerUrl}/edit_profile`;
const uriParts = uri.split('.');
const fType = uriParts[uriParts.length - 1];
setFileType(fType);
const formData = new FormData();
formData.append('photo', {
uri,
name: `${profile.username}.${fType}`,
type: `image/${fType}`,
});
axios.post(serverUrl, formData) //I didn't encapsulate formData in an object
.then(({ data }) => {
console.log(data);
})
.catch((err) => {
console.log(JSON.stringify(err));
});
}
服务器端:
const multer = require('multer');
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'images/');
},
filename: function (req, file, cb) {
cb(null, file.originalname);
},
});
const upload = multer({ storage: storage });
router.post('/', upload.single('photo'), (req, res) => {
if(!req.file) {
res.send('No file uploaded !')
}else{
res.send('File uploaded successfully !')
}
});
【问题讨论】:
-
我对 FormData 不是很熟悉,但是在查看文档后,我认为您传递给 formData.append 函数的参数不正确。第二个参数的类型应该是
File,但你传入的是一个对象。该对象中的变量image是什么? -
image 是 uri(即评论),但是该示例取自 expo 的 github,所以我认为这不是问题所在。
-
他们 github 上的示例在哪里?我发现的唯一上传示例是使用
File这样的data.append('file', document.getElementById('file').files[0]);这是上传文件的正确方法。 github.com/axios/axios/blob/master/examples/upload/index.html
标签: javascript node.js express axios multer