将图片从Android上传到WebApi项目

将图片从Android上传到WebApi项目,android,asp.net-web-api,upload,android-volley,multipartform-data,Android,Asp.net Web Api,Upload,Android Volley,Multipartform Data,我正在尝试将图片从android应用程序上载到IIS服务器上的web api项目。首先,在Android端,我提出了以下定制截击请求: public class PictureRequest extends Request<NetworkResponse> { private String mMimeType; private byte[] mMultipartBody; private final Response.Listener<NetworkResponse>

我正在尝试将图片从android应用程序上载到IIS服务器上的web api项目。首先,在Android端,我提出了以下定制截击请求:

public class PictureRequest extends Request<NetworkResponse> {


private String mMimeType;
private byte[] mMultipartBody;
private final Response.Listener<NetworkResponse> mListener;
private final Response.ErrorListener mErrorListener;

public PictureRequest(String url, String mimeType, byte[] multipartBody, Response.Listener<NetworkResponse> listener, Response.ErrorListener errorListener) {
    super(Method.POST, (ApplicationController.getInstance().getWS_BASE_URI() + url), errorListener);
    this.mMimeType = mimeType;
    this.mMultipartBody = multipartBody;
    this.mListener = listener;
    this.mErrorListener = errorListener;
}

@Override
protected void deliverResponse(NetworkResponse response) 
{
    mListener.onResponse(response);
}


@Override
protected Response<NetworkResponse> parseNetworkResponse(NetworkResponse response) {

    try {
        return Response.success(response, HttpHeaderParser.parseCacheHeaders(response));
    } catch (Exception e) {
        return Response.error(new ParseError(e));
    }

}

@Override
public void deliverError(VolleyError error) {
    mErrorListener.onErrorResponse(error);
}

@Override
public Map<String, String> getHeaders() throws AuthFailureError {
    Map<String, String> headers = new HashMap<String, String>();
    String auth = "Basic " + Base64.encodeToString((ApplicationController.getInstance().getWS_KEY()+":").getBytes(),
                    Base64.NO_WRAP);
    headers.put("Authorization", auth);
    return headers;
}

@Override
public String getBodyContentType() {
    return mMimeType;
}

@Override
public byte[] getBody() throws AuthFailureError {
    return mMultipartBody;
}
模拟类型如下所示:

long boundary = System.currentTimeMillis();
String mimeType = "multipart/form-data;boundary=" + boundary;
在服务器端,在控制器上的地址Profil/UpdatePicture 我有以下捕获多数据表单请求的方法:

[HttpPost]
    [Route("api/Profil/UpdatePicture")]
    public async Task<HttpResponseMessage> UpdatePicture()
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }
        string root = HttpContext.Current.Server.MapPath("~/Data/IN/ProfilPictures");
        var provider = new CustomMultipartFormDataStreamProvider(root);

        var task = await Request.Content.ReadAsMultipartAsync(provider).
            ContinueWith<HttpResponseMessage>(t =>
            {
                if (t.IsFaulted || t.IsCanceled)
                {
                    Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception);
                }
                return Request.CreateResponse(HttpStatusCode.OK);
            });

        return task;
    }
[HttpPost]
[路线(“api/Profil/UpdatePicture”)]
公共异步任务UpdatePicture()
{
如果(!Request.Content.IsMimeMultipartContent())
{
抛出新的HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root=HttpContext.Current.Server.MapPath(“~/Data/IN/ProfilPictures”);
var provider=新的CustomMultipartFormDataStreamProvider(根);
var task=wait Request.Content.ReadAsMultipartAsync(提供程序)。
继续(t=>
{
如果(t.IsFaulted | | t.IsCanceled)
{
Request.CreateErrorResponse(HttpStatusCode.InternalServerError,t.Exception);
}
返回Request.CreateResponse(HttpStatusCode.OK);
});
返回任务;
}
如您所见,我使用了自定义的MultipartFormStreamProvider来创建自定义文件名模式

当我试图从web api UI上的HTML表单上传图片时,上传成功。但是当我使用上面的截击请求从我的Android应用程序上传时,即使我得到200个Http代码作为回报,图片也不会上传。。。IIS服务器完全控制必须上载图片的目标文件夹。 我处理这个问题已经两天了。。。
有人看到问题出在哪里了吗?

请在活动中发布更多代码,您是如何调用您的请求的。另外,你看过我下面的问题了吗?嘿,谢谢!事实上是的,我的代码是基于你的问题,因为我在改编时做了一些错误的事情。过一会儿我会回答我的问题,直接转到你的问题!伟大的你可以写一篇关于它的文章,就像很多人搜索它一样;)@BNKAnother选项正在使用
OkHttp
,请查看我的github链接:)
[HttpPost]
    [Route("api/Profil/UpdatePicture")]
    public async Task<HttpResponseMessage> UpdatePicture()
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }
        string root = HttpContext.Current.Server.MapPath("~/Data/IN/ProfilPictures");
        var provider = new CustomMultipartFormDataStreamProvider(root);

        var task = await Request.Content.ReadAsMultipartAsync(provider).
            ContinueWith<HttpResponseMessage>(t =>
            {
                if (t.IsFaulted || t.IsCanceled)
                {
                    Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception);
                }
                return Request.CreateResponse(HttpStatusCode.OK);
            });

        return task;
    }