博客
关于我
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中datetime与timestamp类型有什么区别
查看>>
MySQL中DQL语言的执行顺序
查看>>
mysql中floor函数的作用是什么?
查看>>
MySQL中group by 与 order by 一起使用排序问题
查看>>
mysql中having的用法
查看>>
MySQL中interactive_timeout和wait_timeout的区别
查看>>
mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
查看>>
mysql中json_extract的使用方法
查看>>
mysql中json_extract的使用方法
查看>>
mysql中kill掉所有锁表的进程
查看>>
mysql中like % %模糊查询
查看>>
MySql中mvcc学习记录
查看>>
mysql中null和空字符串的区别与问题!
查看>>
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
查看>>
MYSQL中TINYINT的取值范围
查看>>
MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
查看>>
Mysql中varchar类型数字排序不对踩坑记录
查看>>
MySQL中一条SQL语句到底是如何执行的呢?
查看>>
MySQL中你必须知道的10件事,1.5万字!
查看>>
MySQL中使用IN()查询到底走不走索引?
查看>>