9

我目前正在使用Web API开发REST Web 服务。我在处理通过 POST 请求传输的二进制数据(图像)时遇到了问题。

从客户端的角度来看,我已经设法使用jQuery Form Plugin发送二进制数据。但是因为我对 .NET 非常陌生(我是一名 PHP 开发人员),所以我很难通过服务器上的 Web API 处理这些二进制数据。

为了确认 jQuery 表单插件正确发送图像数据,我编写了一个使用简单全局变量的有效PHP处理程序。$_FILE

现在我正在尝试通过 Web API 来完成同样的事情。这是我尝试过的概述。如何访问已发送的二进制数据?

模型:

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; }
    }
}

控制器(显示部分代码):

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.
}
4

2 回答 2

10

简而言之,您必须将数据发送为multipart/form-data(我很确定,您已经通过您提到的插件执行此操作),然后您必须使用 Web APIMultipartContent提供程序之一提取该数据。

有很多资源可以解释如何做到这一点:

于 2013-02-07T01:36:41.550 回答
3

我取得了同样的成就

这是我的上传用户类

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;
        }
    }

}

这是我的 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;
    }
}

在这段代码中,我使用

HttpRequestMessage 用于在客户端到服务器服务器到客户端之间传输数据。

于 2016-09-29T12:57:14.460 回答