博客
关于我
multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
阅读量:794 次
发布时间:2023-02-10

本文共 2051 字,大约阅读时间需要 6 分钟。

上传文件到.net(WCF)后台时的解决方案

在实际开发中,文件上传功能常常会遇到Content-Type不匹配的问题。以下是关于如何解决这种问题的详细分析和解决方案。

1. 问题背景

在使用WCF后台服务上传文件时,往往会遇到以下情况:

  • 后台服务要求请求体的Content-Type为application/octet-stream,但使用multipart/form-data时,由于两者在请求体组织方式上存在差异,导致文件上传失败。

2. Content-Type的区别

  • multipart/form-data

    • 适用于提交键值对和文件的场景,适合HTTP客户端(如浏览器、Java的HttpClient)使用。
    • 请求体中包含明确的边界标识符,各部分数据以--WebKitFormBoundary(或其他自定义边界)分隔。
    • 每个部分包含Content-DispositionContent-Type等字段,明确指定文件名和文件类型。
  • application/octet-stream

    • 适用于提交二进制数据,通常用于单文件上传场景。
    • 后台服务需要将整个请求体解析为二进制流处理。

3. 解决方案

根据后台服务的需求,以下是两种Content-Type的使用场景和实现方法:

(1)使用multipart/form-data
  • 适用于支持多文件上传和键值对提交的场景。
  • 请求体组织方式清晰,便于后台解析。

请求示例:

POST http://www.xx.com/myproject/service1 HTTP/1.1Host: 192.168.0.201:8694Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gWCache-Control: no-cachePostman-Token: c3d85a6c-9849-7e3e-5c89-5b994b335b1d----WebKitFormBoundary7MA4YWxkTrZu0gWContent-Disposition: form-data; name="name1"value1----WebKitFormBoundary7MA4YWxkTrZu0gWContent-Disposition: form-data; name="name2"value2----WebKitFormBoundary7MA4YWxkTrZu0gWContent-Disposition: form-data; name="file1"; filename="94b5b232gw1ewlx3p595wg20ak0574qq.gif"Content-Type: image/gif----WebKitFormBoundary7MA4YWxkTrZu0gWContent-Disposition: form-data; name="file2"; filename="1443175219259.jpg"Content-Type: image/jpeg
(2)使用application/octet-stream
  • 适用于单文件上传场景。
  • 后台服务需要将整个请求体解析为二进制流处理。

请求示例:

POST http://www.xx.com/myproject/service HTTP/1.1Host: 192.168.0.201:8694Content-Type: application/octet-streamCache-Control: no-cachePostman-Token: f5f6240c-08d3-8695-9473-607038f71eaaname11=file1&name2=value2

4. 综合解决方案

根据实际需求选择合适的Content-Type,并在代码中实现相应的请求体构造方式。以下是常见的实现方法:

  • 使用multipart/form-data

    • 在WCF客户端,使用HttpWebRequest或自定义的MultipartStream来构造请求体。
    • 确保每个部分包含Content-DispositionContent-Type字段,后台服务可以正确解析。
  • 使用application/octet-stream

    • 将文件内容直接发送为二进制流。
    • 在代码中使用MemoryStreamFileStream来读取文件内容,并将其写入请求流中。

5. 注意事项

  • 边界标识符:确保在构造multipart/form-data时,使用唯一且不重复的边界标识符。
  • 文件名编码:根据后台服务的要求,确保文件名经过适当的编码(如URL编码或UTF-8编码)。
  • 缓冲流管理:正确处理输入流和输出流,避免资源泄漏。

通过以上方法,可以根据后台服务的需求灵活选择合适的Content-Type,确保文件上传功能的正常运行。

转载地址:http://lmffk.baihongyu.com/

你可能感兴趣的文章
mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
查看>>
MySQL5.7.37windows解压版的安装使用
查看>>
mysql5.7免费下载地址
查看>>
mysql5.7命令总结
查看>>
mysql5.7安装
查看>>
mysql5.7性能调优my.ini
查看>>
MySQL5.7新增Performance Schema表
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>