为了账号安全,请及时绑定邮箱和手机立即绑定

带有改装的多部分内容

带有改装的多部分内容

C#
喵喔喔 2021-11-21 10:18:32
我正在将 multipart 与 Refit 一起使用。我尝试为我的服务上传个人资料图片,邮递员生成的代码看起来像这样var client = new RestClient("http://api.example.com/api/users/1");var request = new RestRequest(Method.POST);request.AddHeader("Postman-Token", "xxx");request.AddHeader("Cache-Control", "no-cache");request.AddHeader("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");request.AddParameter("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW", "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"_method\"\r\n\r\nput\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"profile_picture\"; filename=\"ic_default_avatar.png\"\r\nContent-Type: image/png\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--", ParameterType.RequestBody);IRestResponse response = client.Execute(request);然后我像这样构造 Refit 方法[Multipart][Post("/users/{id}")]IObservable<BaseResponse<User>> UpdateProfilePicture(int id,[AliasAs("profile_picture")] byte[] profilePicture,[AliasAs("_method")]string method="put");如果我使用byte[]否则ByteArrayPart它会抛出异常{System.Net.Http.HttpRequestException:发送请求时出错---> System.Net.WebException:获取响应流时出错(分块Read2):ReceiveFailure ---> System.Exception:在System.Net.WebConnection .HandleError (System.Net.WebExceptionStatus st, System.Exception e, System.String where) [0x00031] in :0 at System.Net.WebConnection.Read (System.Net.HttpWebRequest request, System.Byte[] buffer, System .Int32 offset, System.Int32 size) [0x000d2] in :0 at System.Net.WebConnectionStream.ReadAll () [0x0010e] in :0 at System.Net.HttpWebResponse.ReadAll () [0x00011] in :0 at System.. 如果我使用StreamorStreamPart它也会抛出异常表示流已关闭。
查看完整描述

2 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

您可以使用IEnumerable<StreamPart>上传文件:

  [Multipart]
  [Post("/users/{id}")]  
  Task UpdateProfilePicture(int id, [AliasAs("profile_picture")] IEnumerable<StreamPart> streams);



查看完整回答
反对 回复 2021-11-21
?
郎朗坤

TA贡献1921条经验 获得超9个赞

这是一个老问题,但也许它可以帮助其他人。


我也无法使用StreamPart,因为在服务器端收到的文件大小始终为 0,所以我ByteArrayPart改为使用github.com/reactiveui/refit#multipart-uploads 中指定的那样。


界面:


[Multipart]

[Post("/api/<some-path>")]

Task<HttpResponseMessage> Upload([AliasAs("file")] ByteArrayPart bytes);

用法:


var stream;

using (MemoryStream ms = new MemoryStream())

{

    stream.CopyTo(ms);

    client.Upload(new ByteArrayPart(ms.ToArray(), fileName));

}

请注意,此技术将在内存中加载整个流! 它对我有用,因为我有小文件,但是如果您正在处理大文件或内存使用问题,您应该找到更好的方法。


查看完整回答
反对 回复 2021-11-21
  • 2 回答
  • 0 关注
  • 217 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信