将图片从Android上传到WebApi项目
我正在尝试将图片从android应用程序上载到IIS服务器上的web api项目。首先,在Android端,我提出了以下定制截击请求:将图片从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>
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;
}