【问题标题】:Upload file to ASP web service with HTTP/1.1 POST使用 HTTP/1.1 POST 将文件上传到 ASP Web 服务
【发布时间】:2011-03-24 00:03:28
【问题描述】:

我正在尝试通过 HTTP 1.1 POST 从客户端应用程序将文件上传到 ASP 2.0 Web 服务。如果我的网络服务函数声明为

<WebMethod()>
Public Function UploadFile(ByVal file as Byte(), ByVal fileName as String) as String
...

测试表说请求应该采用这种形式:

POST address_of_service HTTP/1.1
Host: <host>
Content-Type: application/x-www-form-urlencoded
Content-Length: length

file=string&file=string&fileName=string

如何将我的二进制文件数据转换为该格式?我尝试将文件数据转换为字符串并将其放入正文 (file=&lt;string_data_here&gt;) 但我收到 HTTP 500 错误,抱怨无法将其转换为 System.Byte。我在应用程序的其他地方使用纯字符串参数使 HTTP POST 工作正常。

另外,出于好奇,为什么文件参数显示两次?

【问题讨论】:

  • 我认为上传文件需要将表单编码类型设置为“multipart/form-data”

标签: asp.net web-services file-upload


【解决方案1】:

将二进制流转换为基于 Base64 的字符串,并使用 Post 将其传递给 Web 服务。当 web 服务接收到执行调用时,您可以将 Base64 字符串转换回原始二进制数组序列。

见下文;

将文件转换为Base64字符串到POST;

var fileStream = File.Open(<your file path>, FileMode.Open, FileAccess.Read);
var reader = new BinaryReader(fileStream);
var data = new byte[fileStream.Length];
reader.Read(data, 0, data.Length);
var strBase64 = Convert.ToBase64String(data, 0, data.Length);

在 SOAP webservice 方法中将其转换回二进制:

var data = Convert.FromBase64String(<your webmethod input Base64 string>);

免责声明:我在没有机会测试它是否可以编译的情况下提供了这个示例,但它应该有望为您指明正确的方向来完成您的要求。

【讨论】:

  • 这让我更进一步,但 Convert.FromBase64String 调用在服务器端失败,因为它是“base-64 字符数组的无效长度”。
  • @Tom:base64 字符串的长度必须为 0 或 4 的倍数才有效。确保正确设置了 Convert.ToBase64String 的长度参数。就像我说的,我面前没有机器要测试,但如果你仍然卡住,稍后再看看。
  • 我认为这只是一个字符串编码问题(通过网络);如果我将客户端生成的字符串硬编码到服务器端代码中,它会保存一个有效的图像。我想我现在可以弄清楚了。
  • @Tom:太好了,很高兴我能帮上忙。在旁注中,请记住确保适当增加包含 Web 服务的网站中的最大请求长度,以适应传递的较大字符串。
猜你喜欢
  • 2014-06-04
  • 1970-01-01
  • 2016-06-06
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多