You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native客户端无法向MongoDB传图,Postman可正常上传

React Native图片上传MongoDB空数据问题排查

问题描述

通过Postman可正常将图片存入MongoDB,但React Native客户端上传后,MongoDB中img.data为空的BinData,怀疑FormData配置有误。

客户端代码问题分析

当前上传代码的FormData构造存在两处关键错误:

  • FormData文件字段格式错误:React Native中上传文件时,FormData需直接传递包含uri、type、name的对象,而非嵌套的img子对象,当前写法会导致服务端无法正确解析文件内容。
  • 文件类型判断逻辑无效:'image/jpg' || 'image/jpeg' || 'image/png' || 'image/gif'的写法结果永远是'image/jpg',无法根据实际文件类型动态匹配,也未关联文件真实类型。

修正后的上传代码

const uploadImage = async (selectedImageUri) => {
    if(!selectedImageUri){
        console.error("Kein Bild zum Hochladen ausgewählt.");
        return;
    }

    // 提取文件名和文件类型
    const fileName = extractFileName(selectedImageUri);
    // 从URI推断文件类型,或根据实际选择的文件类型传入
    const fileType = selectedImageUri.endsWith('.png') ? 'image/png' : 
                     selectedImageUri.endsWith('.gif') ? 'image/gif' : 'image/jpeg';

    const formData = new FormData();
    // 正确的FormData文件字段格式
    formData.append('image', {
        uri: selectedImageUri,
        name: fileName,
        type: fileType,
    });

    try {
        const response = await axios.post('https://4c5b-77-0-73-93.ngrok-free.app/uploadImage', formData, {
            headers: {
                // 无需手动设置Content-Type,axios会自动生成带boundary的multipart/form-data
            },
        });

        console.log("Bild wurde erfolgreich hochgeladen", response.data);
        alert('Bild wurde erfolgreich hochgeladen.');

    } catch (error) {
        console.error("Fehler beim Hochladen des Bildes: ", error);
        alert("Fehler beim Hochladen des Bildes.");
    }
};

额外说明

  • 不要手动设置Content-Type: multipart/form-data,axios会自动处理并添加正确的boundary参数,手动设置反而可能导致解析失败。
  • 如果服务端期望对应MongoDB的img嵌套结构,可调整服务端解析逻辑,或在FormData中分别传递name、img.data、img.contentType字段,但更推荐直接上传文件流,由服务端转换为BinData存储。

内容的提问来源于stack exchange,提问作者Kami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:22:38