【问题标题】:Processing binary data in Web API from a POST or PUT REST request处理来自 POST 或 PUT REST 请求的 Web API 中的二进制数据
【发布时间】:2013-01-22 08:25:46
【问题描述】:

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

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

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

现在我正在尝试通过 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.
}

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

    【解决方案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 用于在客户端到服务器服务器到客户端之间传输数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多