博客
关于我
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/

你可能感兴趣的文章
MySql优化系列-进阶版造数据(load data statment)-3
查看>>
MySql优化系列-造数据(存储过程+函数)-1
查看>>
MySQL优化配置详解
查看>>
Mysql优化高级篇(全)
查看>>
mysql会员求积分_MySql-统计所有会员的最高前10次的积分和
查看>>
mysql会对联合索性排序优化_MySQL索引优化实战
查看>>
MySQL作为服务端的配置过程与实际案例
查看>>
Mysql使用命令行备份数据
查看>>
MySQL保姆级教程(SQL语法基础篇)从小白到高手的进阶指南,收藏这一篇就够了
查看>>
MySQL修改root密码的各种方法
查看>>
MySQL修改root密码的多种方法
查看>>
mysql修改一列属性
查看>>
MySQL修改密码报错ERROR 1396 (HY000): Operation ALTER USER failed for ‘root‘@‘localhost‘
查看>>
Mysql全局优化参数
查看>>
MySQL全文索引实现简单版搜索引擎
查看>>
MySQL全面瓦解:安装部署与准备
查看>>
mysql共享锁与排他锁
查看>>
MySQL内存表使用技巧
查看>>
MySQL再叙(体系结构、存储引擎、索引、SQL执行过程)
查看>>
mysql出现错误的解决办法
查看>>