9

現在、WebAPIを使用してRESTWebサービスを開発しています。POSTリクエストを介して送信されたバイナリデータ(画像)の処理で問題が発生しました。

クライアントの観点から、私はjQueryフォームプラグインを使用してバイナリデータを送信することができました。しかし、私は.NETに非常に慣れていないため(私はPHP開発者です)、サーバー上のWebAPIを介してこのバイナリデータを処理するのに苦労しています。

jQueryフォームプラグインが画像データを正しく送信していることを確認するために、単純なグローバル変数を使用する動作するPHPハンドラーを作成しました。$_FILE

今、私はWebAPIを介して同じことを達成しようとしています。これが私が試したことの概要です。送信されたバイナリデータにアクセスするにはどうすればよいですか?

モデル:

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(これは、あなたが言及したプラグインを介して既に実行していると確信しています)。次に、WebAPIMultipartContentプロバイダーの1つを使用してそのデータを抽出する必要があります。

その方法を説明するリソースはたくさんあります。

于 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 に答える