从POST或PUT REST请求处理Web API中的二进制数据

时间:2013-02-06 23:33:57

标签: c# asp.net file-upload asp.net-web-api binary

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

从客户端的角度来看,我已经设法使用 jQuery Form Plugin 发送二进制数据。但是因为我是.NET的新手(我是PHP开发人员),我在服务器上通过Web API处理这个二进制数据时遇到了困难。

为了确认jQuery Form Plugin正在正确发送图像数据,我编写了一个有效的 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.
}

2 个答案:

答案 0 :(得分:9)

简而言之,您必须将数据发送为multipart/form-data(我很确定,您已经通过您提到的插件进行了处理),然后您必须使用Web API之一提取数据MultipartContent个提供商。

有很多资源解释如何:

答案 1 :(得分:2)

我取得了同样的成就

这是我的上传用户类

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用于将clinet与服务器服务器之间的传输数据传输到客户端。