C# 从 POST 或 PUT REST 请求处理 Web API 中的二进制数据
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14740929/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Processing binary data in Web API from a POST or PUT REST request
提问by goseta
I'm currently developing a RESTweb service using Web API. I have encountered a problem processing binary data(an image) that has been transmitted via a POST request.
我目前正在使用Web API开发RESTWeb 服务。我在处理通过 POST 请求传输的二进制数据(图像)时遇到问题。
From the perspective of the client, I have managed to send binary data using the jQuery Form Plugin. But because I'm very new to .NET (I'm a PHP developer), I'm having difficulty processing this binary data via Web API on the server.
从客户端的角度来看,我已经设法使用jQuery Form Plugin发送二进制数据。但是因为我对 .NET 非常陌生(我是一名 PHP 开发人员),所以我在通过服务器上的 Web API 处理这些二进制数据时遇到了困难。
To confirm that the jQuery Form Plugin is sending the image data correctly, I have written a working PHPhandler that makes use of the simple $_FILE
global variable.
为了确认 jQuery 表单插件正确发送图像数据,我编写了一个使用简单全局变量的PHP处理程序$_FILE
。
Now I am trying to accomplish the same via Web API. Here is an outline of what I have tried. How do I access the binary data that has been sent?
现在我正在尝试通过 Web API 完成相同的任务。这是我尝试过的概述。如何访问已发送的二进制数据?
Model:
模型:
namespace EDHDelivery.Models
{
public class Oferta
{
public int OfertaID { get; set; }
public string Nombre { get; set; }
public string Imagen { get; set; }
public int ComercioID { get; set; }
}
}
Controller (partial code shown):
控制器(显示部分代码):
public Oferta Add(Oferta item)
{
/*here my item will have the POST body with form values,
automatically serialized by the framework and I think an image binary*/
var n = item.Nombre; //...etc.
}
采纳答案by Filip W
In short, you have to send the data as multipart/form-data
(which, I'm pretty sure, you are already doing through the plugin you mentioned) and then you have to extract that data using one of Web API MultipartContent
providers.
简而言之,您必须将数据发送为multipart/form-data
(我很确定,您已经通过您提到的插件这样做了),然后您必须使用 Web APIMultipartContent
提供程序之一提取该数据。
There are plenty of resources explaining how to that:
有很多资源解释了如何做到这一点:
回答by mukesh UN singh
The same thing I have achieved
我已经取得了同样的成就
This is my upload user Class
这是我的上传用户类
public class UploadUserFile
{
string _Token;
string _UserId;
string _IPAddress;
string _DeviceInfo;
string _FileName;
string _ContentType;
Stream _PhotoStream;
public string Token
{
get
{
return _Token;
}
set
{
_Token = value;
}
}
public string UserId
{
get
{
return _UserId;
}
set
{
_UserId = value;
}
}
public string IPAddress
{
get
{
return _IPAddress;
}
set
{
_IPAddress = value;
}
}
public string DeviceInfo
{
get
{
return _DeviceInfo;
}
set
{
_DeviceInfo = value;
}
}
public string FileName
{
get
{
return _FileName;
}
set
{
_FileName = value;
}
}
public string ContentType
{
get
{
return _ContentType;
}
set
{
_ContentType = value;
}
}
public Stream PhotoStream
{
get
{
return _PhotoStream;
}
set
{
PhotoStream = value;
}
}
}
This is my API Controller class
这是我的 API 控制器类
public class UploadUserPhotoController : ApiController
{
/// <summary>
/// </summary>
/// <param name="request">
/// HttpRequestMessage, on the other hand, is new in .NET 4.5.
/// It is part of System.Net.
/// It can be used both by clients and services to create, send and receive requests and
/// responses over HTTP.
/// It replaces HttpWebRequest, which is obsolete in .NET 4.5
/// </param>
/// <returns>return the response of the Page <returns>
[HttpPost]
public async Task<HttpResponseMessage> Post(HttpRequestMessage request)
{
var httpRequest = HttpContext.Current.Request;
var UploadUserFileObj = new UploadUserFile
{
Token = request.GetQueryNameValuePairs().AsEnumerable().Where(x => x.Key == "Token").FirstOrDefault().Value.ToString(),
UserId = request.GetQueryNameValuePairs().AsEnumerable().Where(x => x.Key == "UserId").FirstOrDefault().Value.ToString(),
IPAddress = request.GetQueryNameValuePairs().AsEnumerable().Where(x => x.Key == "IPAddress").FirstOrDefault().Value.ToString(),
ContentType = request.GetQueryNameValuePairs().AsEnumerable().Where(x => x.Key == "ContentType").FirstOrDefault().Value.ToString(),
DeviceInfo = request.GetQueryNameValuePairs().AsEnumerable().Where(x => x.Key == "DeviceInfo").FirstOrDefault().Value.ToString(),
FileName = request.GetQueryNameValuePairs().AsEnumerable().Where(x => x.Key == "FileName").FirstOrDefault().Value.ToString()
};
Stream requestStream = await request.Content.ReadAsStreamAsync();
HttpResponseMessage result = null;
if (requestStream!=null)
{
try
{
if(string.IsNullOrEmpty(UploadUserFileObj.FileName))
{
UploadUserFileObj.FileName = "DefaultName.jpg";
}
// Create a FileStream object to write a stream to a file
using (FileStream fileStream = System.IO.File.Create(HttpContext.Current.Server.MapPath("~/locker/" + UploadUserFileObj.FileName), (int)requestStream.Length))
{
// Fill the bytes[] array with the stream data
byte[] bytesInStream = new byte[requestStream.Length];
requestStream.Read(bytesInStream, 0, (int)bytesInStream.Length);
// Use FileStream object to write to the specified file
fileStream.Write(bytesInStream, 0, bytesInStream.Length);
result = Request.CreateResponse(HttpStatusCode.Created, UploadUserFileObj.FileName);
}
}
catch (HttpException ex)
{
return result = Request.CreateResponse(HttpStatusCode.BadGateway,"Http Exception Come"+ ex.Message);
}
catch(Exception ex)
{
return result = Request.CreateResponse(HttpStatusCode.BadGateway, "Http Exception Come" + ex.Message);
}
}
else
{
return result = Request.CreateResponse(HttpStatusCode.BadGateway, "Not eble to upload the File ");
}
return result;
}
}
In this code I am using the
在这段代码中,我使用
HttpRequestMessage for Transferred data between clinet to server server to client.
HttpRequestMessage 用于在客户端到服务器服务器到客户端之间传输数据。