【发布时间】:2021-01-06 02:30:00
【问题描述】:
我正在尝试上传使用 Expo 的 ImagePicker 检索到的图像。这是我的 React Native 组件:
import * as ImagePicker from "expo-image-picker";
const Foo = () => {
const [photoUri, setPhotoUri] = useState("");
const choosePhoto = async () => {
const result = await ImagePicker.launchImageLibraryAsync({
mediaTypes: ImagePicker.MediaTypeOptions.Images,
allowsEditing: true,
quality: 1,
});
setPhotoUri(result.cancelled ? "" : result.uri);
};
const uploadPhoto = async () => {
if (photoUri == "") {
return;
}
const formData = new FormData();
formData.append("photo", {
uri: photoUri,
name: "test",
type: "image/jpeg",
});
return await fetch(Constants.manifest.extra.UPLOAD_IMAGE_URI, {
method: "POST",
body: formData,
headers: {
// No header otherwise multer will complain about missing boundary
// "content-type": "multipart/form-data",
},
});
};
return (
<View>
<TouchableOpacity onPress={choosePhoto}>
<Text>Choose Photo</Text>
<TouchableOpacity onPress={uploadPhoto}>
<Text>Confirm Image</Text>
</TouchableOpacity>
</TouchableOpacity>
);
};
这是我的 Express 后端:
import * as express from "express";
import * as multer from "multer";
const app = express();
const fileUpload = multer();
app.post(
"/profile_image/upload",
fileUpload.single("photo"),
async (req, _res, _next) => {
console.log(req.body);
console.log(req.body.photo);
console.log(req.file);
}
);
app.listen(
{
port: 8000,
},
() => {
console.log("Started server!");
}
);
当我在 Web 版本中测试它并检查我的 Chrome 控制台时,它显示请求是在 photo 字段是字符串 '[object Object]' 的地方发出的。
同样,我的 Express 端点将字段解析为字符串:
[Object: null prototype] { photo: '[object Object]' }
[object Object]
undefined
另外,另一个奇怪的事情是ImagePicker 返回的photoUri,至少在 Web 应用程序中,默认为 base64 编码版本,而不是实际的文件路径。不确定这是不是故意的:
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD//gA8Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBxdWFsaXR5ID0gMTAwCv/bAEMAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA...
【问题讨论】:
-
再次尝试使用
multipart/form-data标头并尝试访问索引为0 req.body.photo[0]的文件
标签: react-native expo multer