博客
关于我
multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
阅读量:793 次
发布时间: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万字总结!超详细!
查看>>
Mysql下载以及安装(新手入门,超详细)
查看>>
MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
查看>>
MySQL不同字符集及排序规则详解:业务场景下的最佳选
查看>>
Mysql不同官方版本对比
查看>>
MySQL与Informix数据库中的同义表创建:深入解析与比较
查看>>
mysql与mem_细说 MySQL 之 MEM_ROOT
查看>>
MySQL与Oracle的数据迁移注意事项,另附转换工具链接
查看>>
mysql丢失更新问题
查看>>
MySQL两千万数据优化&迁移
查看>>
MySql中 delimiter 详解
查看>>
MYSQL中 find_in_set() 函数用法详解
查看>>
MySQL中auto_increment有什么作用?(IT枫斗者)
查看>>
MySQL中B+Tree索引原理
查看>>
mysql中cast() 和convert()的用法讲解
查看>>
mysql中datetime与timestamp类型有什么区别
查看>>
MySQL中DQL语言的执行顺序
查看>>
mysql中floor函数的作用是什么?
查看>>
MySQL中group by 与 order by 一起使用排序问题
查看>>
mysql中having的用法
查看>>