如何使用 Retrofit 在 android 中调用图像上传 Web 服务 (ASP.NET) .asmx 文件
Posted
技术标签:
【中文标题】如何使用 Retrofit 在 android 中调用图像上传 Web 服务 (ASP.NET) .asmx 文件【英文标题】:How to call the Image upload web service (ASP.NET ) .asmx file in android using Retrofit 【发布时间】:2020-01-14 11:21:50 【问题描述】:我正在尝试使用改造将文件夹中的图像文件从 android 上传到 asp.net(Web Service-.asmx 文件)。
我已经为此创建了 web 方法,并且该 web 方法工作正常,我也在 postman 上进行了测试。
但是当我尝试从 android 上传时,它会显示“500 Internal Server Error”
Web 方法(ASP.NET .asmx 文件)
[WebMethod]
public void UploadImage_http()
var request = HttpContext.Current.Request;
var photo = request.Files["photo"];
photo.SaveAs(HttpContext.Current.Server.MapPath("images/thumbnail/"+photo.FileName));
javascriptSerializer js = new JavaScriptSerializer();
Feed feed = new Feed();
feed.err = false;
feed.err_message = "inserted success";
Context.Response.Write(js.Serialize(feed));
Android 端代码
API 接口
@Multipart
@POST("/FeedAPI.asmx/UploadImage_http")
public void upload(@Part("photo") MultipartBody.Part photo, Callback<Feed> callback);
API 调用
public void btnSelectSave(View view)
File file = new File(selectedImagePath);
// selectedImagePath contains the path of the image.
Toast.makeText(this, file.getName(), Toast.LENGTH_SHORT).show();
RequestBody photoContent = RequestBody.create(MediaType.parse("multipart/form-data"),file);
MultipartBody.Part photo = MultipartBody.Part.createFormData("photo",file.getName(),photoContent);
Log.e("DATA_ photos", ""+photo);
retrofitService.getService().upload(photo, new Callback<Feed>()
@Override
public void success(Feed feed, Response response)
Toast.makeText(SharePostActivity.this, feed.getErr_message(), Toast.LENGTH_SHORT).show();
@Override
public void failure(RetrofitError error)
Toast.makeText(SharePostActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
);
以下获取路径和值的方法存储在selectedImagePath
public String getRealPathFromURI(Uri contentUri)
String[] proj = MediaStore.Images.Media.DATA;
CursorLoader loader = new CursorLoader(getApplicationContext(),contentUri,proj,null,null,null);
Cursor cursor = loader.loadInBackground();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String result = cursor.getString(column_index);
cursor.close();
return result;
发生错误:
I/System.out: [OkHttp] sendRequest<<
D/Retrofit: <--- HTTP 500 http://192.168.43.25:81/FeedAPI.asmx/UploadImage_http (84ms)
: HTTP/1.1 500 Internal Server Error
D/Retrofit: Cache-Control: private
Content-Length: 55
Content-Type: text/plain; charset=utf-8
Date: Thu, 12 Sep 2019 14:21:21 GMT
Server: Microsoft-IIS/10.0
X-Android-Received-Millis: 1568298080946
X-Android-Response-Source: NETWORK 500
X-Android-Selected-Protocol: http/1.1
D/Retrofit: X-Android-Sent-Millis: 1568298080929
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
D/Retrofit: Object reference not set to an instance of an object.
D/Retrofit: <--- END HTTP (55-byte body)
【问题讨论】:
你能用"image/*"
代替"multipart/form-data"
并告诉我们它返回什么吗?
@axierjhtjz 同样的错误
您是否尝试过使用 POSTMAN,它是否有效?
是的,我试过了,图片也成功上传到我指定的路径
【参考方案1】:
请试试这个
[HttpPost, DisableRequestSizeLimit]
public ActionResult UploadFile(IFormFile file)
using (var stream = file.OpenReadStream())
【讨论】:
此代码在 Web 服务(.asmx 文件)中不起作用此代码是 API 文件,我上面的 Web 服务代码工作正常,我已经在邮递员中验证了以上是关于如何使用 Retrofit 在 android 中调用图像上传 Web 服务 (ASP.NET) .asmx 文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Retrofit 在 android 中调用图像上传 Web 服务 (ASP.NET) .asmx 文件
如何使用 Retrofit Android Kotlin 发布 [重复]
如何在Android上通过retrofit2调用带有Cognito Credentials的API网关?
如何将 AsyncTask 转换为 Retrofit 以从 Android 中的 WCF Webservice 获取数据