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

你可能感兴趣的文章
Multiple websites on single instance of IIS
查看>>
mysql CONCAT()函数拼接有NULL
查看>>
multiprocessing.Manager 嵌套共享对象不适用于队列
查看>>
multiprocessing.pool.map 和带有两个参数的函数
查看>>
MYSQL CONCAT函数
查看>>
multiprocessing.Pool:map_async 和 imap 有什么区别?
查看>>
MySQL Connector/Net 句柄泄露
查看>>
multiprocessor(中)
查看>>
mysql CPU使用率过高的一次处理经历
查看>>
Multisim中555定时器使用技巧
查看>>
MySQL CRUD 数据表基础操作实战
查看>>
multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
查看>>
mysql csv import meets charset
查看>>
multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
查看>>
MySQL DBA 数据库优化策略
查看>>
multi_index_container
查看>>
mutiplemap 总结
查看>>
MySQL Error Handling in Stored Procedures---转载
查看>>
MVC 区域功能
查看>>
MySQL FEDERATED 提示
查看>>