uni-app 'content-type': 'multipart/form-data' 增加后端无法接收文件

uni-app ‘content-type’: ‘multipart/form-data’ 增加后端无法接收文件

19 回复

请贴相关代码

更多关于uni-app 'content-type': 'multipart/form-data' 增加后端无法接收文件的实战教程也可以访问 https://www.itying.com/category-93-b0.html


你可以打断点看看 H5 传递给uploadFile的参数是否正确

回复 BoredApe: 参数应该是正常的 因为去掉header h5 安卓都可以上传(后端也可以接收),ios的话没有表单头的情况下 选择图片会提示格式错误,参考了网上说必须要增加’Content-Type’: ‘multipart/form-data’ ;增加后可以选择图片了 临时路径也有了 但是提交到后端,后端接收不到了(后端同样代码 安卓可以接收)

回复 yancheng909: 苹果手机h5 提交都不行

回复 yancheng909: 写一个测试工程发上来

回复 BoredApe: 加了表单头 好像数据就不是二进制流了

不用添加任何header (token除外) ,因为uploadFile会帮你处理好的。 export function upload(options) {
options.header = Object.assign({
[config.tokenKey]: token.get()
}, options.header);

options.url = config.apiUrl + options.url;  

return uni.uploadFile(options).then(res => {  
    // 注意data为string  
    return JSON.parse(res.data).data;  
}).catch(err => {  
    console.log(err.message);  
    return err;  
});  

};

不添加header 好像ios 选择图片会提示什么格式不对…

回复 yancheng909: 你是添加’content-type’: 'multipart/form-data’吗

回复 呆狗的一生: 是的 提交了content-type’: ‘multipart/form-data’ 这个就不行了

回复 yancheng909: 是后端接口报错的吗?我后端用的nodejs,上面的代码是我自己用的。没有加这个header

回复 呆狗的一生: 不添加content-type’: ‘multipart/form-data’ 后端没有问题,添加了content-type’: ‘multipart/form-data’ 后端接收为空 中间没有其他代码修改

插件
<uni-file-picker title=“请上传图片作品(10m以下)” v-model=“imageValue” file-mediatype=“image”
file-extname=“png,jpg,gif” ref=‘files’ :limit=“1” @select=“select”
@delete=“deletefile” />

js

uni.uploadFile({
url: url + ‘/Upload/upload’,
filePath: e.tempFilePaths[0],
name: ‘file’,
header: {
‘content-type’: ‘multipart/form-data’
},
formData: {
‘images’: e.tempFilePaths[0]
},
success: function(res) {

                }  
            });<br>

formData感觉是多余的

if (files.length) imgUrls = await this.upload({
filePath: files.map(_ => _.path).join(’,’),
name: ‘filelist’,
url: ‘/tencent/putArray’,
fileType: ‘image/video/audio’,
formData: { pathPrefix: this.pathPrefix }
})

这里的this.upload是上面我贴的upload方法,formData我给出的是一个存储图片的路径前缀。我的header里只加了一个用于检查登录的token

以前是有段时间可以的 测试过的 最近不知道是更新了版本还是怎么回事 就不行了

你这个是uniapp的云服务器吧

回复 yancheng909: 不是。我是上传到腾讯的对象存储桶的。不是uniCloud的服务空间

在使用 uni-app 进行文件上传时,如果后端无法接收到文件,可能是由于请求头或请求体设置不正确导致的。以下是一些可能的原因和解决方案:

1. 确保请求头正确设置

uni-app 中,使用 uni.uploadFile 方法上传文件时,默认的 Content-Typemultipart/form-data,通常不需要手动设置。如果你手动设置了 Content-Type,可能会导致后端无法正确解析请求。

uni.uploadFile({
  url: 'https://example.com/upload',
  filePath: filePath,
  name: 'file',
  formData: {
    // 其他表单数据
  },
  success: (res) => {
    console.log('上传成功', res);
  },
  fail: (err) => {
    console.error('上传失败', err);
  }
});

2. 检查 name 参数

name 参数是后端用来识别文件字段的名称,确保它与后端期望的字段名称一致。

3. 检查 formData 参数

formData 参数用于传递额外的表单数据。确保这些数据不会干扰文件的传输。

4. 后端处理

确保后端能够正确处理 multipart/form-data 类型的请求。不同的后端框架有不同的处理方式,以下是一些常见框架的处理方法:

  • Node.js (Express):

    const multer = require('multer');
    const upload = multer({ dest: 'uploads/' });
    
    app.post('/upload', upload.single('file'), (req, res) => {
      console.log(req.file);
      res.send('文件上传成功');
    });
    
  • Python (Flask):

    from flask import Flask, request
    
    app = Flask(__name__)
    
    [@app](/user/app).route('/upload', methods=['POST'])
    def upload_file():
        file = request.files['file']
        file.save('/path/to/save/' + file.filename)
        return '文件上传成功'
    
  • PHP:

    if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
        $tmp_name = $_FILES['file']['tmp_name'];
        $name = basename($_FILES['file']['name']);
        move_uploaded_file($tmp_name, "/path/to/save/$name");
        echo '文件上传成功';
    } else {
        echo '文件上传失败';
    }
    

5. 调试工具

使用调试工具(如 Postman 或浏览器开发者工具)检查请求头和请求体,确保它们符合预期。

6. 跨域问题

如果前端和后端不在同一个域名下,可能会遇到跨域问题。确保后端服务器配置了正确的 CORS 头。

// Node.js (Express) 示例
app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
  next();
});

7. 文件大小限制

检查后端是否有文件大小限制,确保上传的文件不超过限制。

8. 错误处理

uni.uploadFilefail 回调中打印错误信息,帮助定位问题。

uni.uploadFile({
  url: 'https://example.com/upload',
  filePath: filePath,
  name: 'file',
  formData: {
    // 其他表单数据
  },
  success: (res) => {
    console.log('上传成功', res);
  },
  fail: (err) => {
    console.error('上传失败', err);
  }
});
回到顶部