使用 multer 将本机图像上传到节点服务器
React native image upload to node server with multer
经过几周的尝试,我想在放弃之前寻求帮助。
节点端点运行良好,因为来自 Postman 的请求发送图像并将其存储在服务器中。请参阅下面的服务器代码:
const multer = require('../helpers/multer');
const upload = multer(config.imagesUrl);
module.exports = function(app){
app.post('/species',
// ...
upload.single('image'),
// ...
);
但我无法通过我的 React Native 应用程序完成这项工作。请参阅下面的应用程序代码。
import * as ImagePicker from 'expo-image-picker';
export default function AddUser({ navigation }) {
const [user, setUser] = useState(null);
const pickImage = async () => {
let result = await ImagePicker.launchImageLibraryAsync({
mediaTypes: ImagePicker.MediaTypeOptions.All,
allowsEditing: true,
aspect: [4, 3],
quality: 1,
});
if (!result.cancelled) {
setUser({'image', result.uri});
}
};
function onSubmit(){
let formData = new FormData();
formData.append('name', user.name);
formData.append('groupId', user.group);
// Infer the type of the image
if(user.image){
let fileName = user.image.split('/').pop();
let match = /\.(\w+)$/.exec(fileName);
let fileType = match ? `image/${match[1]}` : `image`;
formData.append('image', {
uri: Platform.OS === 'android' ? user.image : user.image.replace('file://', ''),
name: user.name,
type: fileType,
});
}
axios.post(backend.url + '/user', formData, {
headers: {
Accept: "application/json",
"Content-Type": "multipart/form-data"
}
})
.then(res => {
console.log('SUCCESS');
// ...
})
.catch(err => {
console.log('ERROR');
// ...
});
}
return (
// ...
{ user.image && <Image source={{ uri: user.image }} style={{ width: 200, height: 200 }} /> }
<Button onPress={pickImage} >Pick an image</Button>
<Button onPress={onSubmit} >Send</Button>
//..
);
}
从应用程序提交图片后,没有报错。在服务器端,var req.file 未定义,但请参阅下面的 req.body console.log.
[Object: null prototype] {
name: 'Joe',
groupId: '5e8cdd3b8296523464c7462d',
image: '[object Object]' }
所有其他应用程序调用都是 运行 axios 并且默认 credentials/headers 已经实现。我想避免更改为 rn-fetch-blob 或 fetch。
知道缺少什么吗?
我无法让它工作。我发现可以使用 base64。
这个 post 解释得很好。
我使用了 body-parser 而忘记了 form-data 和 multer!
经过几周的尝试,我想在放弃之前寻求帮助。
节点端点运行良好,因为来自 Postman 的请求发送图像并将其存储在服务器中。请参阅下面的服务器代码:
const multer = require('../helpers/multer');
const upload = multer(config.imagesUrl);
module.exports = function(app){
app.post('/species',
// ...
upload.single('image'),
// ...
);
但我无法通过我的 React Native 应用程序完成这项工作。请参阅下面的应用程序代码。
import * as ImagePicker from 'expo-image-picker';
export default function AddUser({ navigation }) {
const [user, setUser] = useState(null);
const pickImage = async () => {
let result = await ImagePicker.launchImageLibraryAsync({
mediaTypes: ImagePicker.MediaTypeOptions.All,
allowsEditing: true,
aspect: [4, 3],
quality: 1,
});
if (!result.cancelled) {
setUser({'image', result.uri});
}
};
function onSubmit(){
let formData = new FormData();
formData.append('name', user.name);
formData.append('groupId', user.group);
// Infer the type of the image
if(user.image){
let fileName = user.image.split('/').pop();
let match = /\.(\w+)$/.exec(fileName);
let fileType = match ? `image/${match[1]}` : `image`;
formData.append('image', {
uri: Platform.OS === 'android' ? user.image : user.image.replace('file://', ''),
name: user.name,
type: fileType,
});
}
axios.post(backend.url + '/user', formData, {
headers: {
Accept: "application/json",
"Content-Type": "multipart/form-data"
}
})
.then(res => {
console.log('SUCCESS');
// ...
})
.catch(err => {
console.log('ERROR');
// ...
});
}
return (
// ...
{ user.image && <Image source={{ uri: user.image }} style={{ width: 200, height: 200 }} /> }
<Button onPress={pickImage} >Pick an image</Button>
<Button onPress={onSubmit} >Send</Button>
//..
);
}
从应用程序提交图片后,没有报错。在服务器端,var req.file 未定义,但请参阅下面的 req.body console.log.
[Object: null prototype] {
name: 'Joe',
groupId: '5e8cdd3b8296523464c7462d',
image: '[object Object]' }
所有其他应用程序调用都是 运行 axios 并且默认 credentials/headers 已经实现。我想避免更改为 rn-fetch-blob 或 fetch。
知道缺少什么吗?
我无法让它工作。我发现可以使用 base64。 这个 post 解释得很好。 我使用了 body-parser 而忘记了 form-data 和 multer!