如何使用 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网关?

深度详解Retrofit2使用实践

深度详解Retrofit2使用实践

如何将 AsyncTask 转换为 Retrofit 以从 Android 中的 WCF Webservice 获取数据