提问者:小点点

Android将gif文件上载到.NET web API时出现内部服务器错误


我测试了.NET web API,postman正在工作,但我尝试在Android中使用okhttp3和retrofit2。我都收到了内部服务器错误500。怎么了?我该怎么办?

分级

实现“com.squareup.okhttp3:okhttp:3.4.1”

实现“com.squareup.okhttp3:logging-interceptor:3.4.1”

实现“com.squareup.reverfit2:reverfit:2.3.0”

实现“com.squareup.reverfit2:converter-gson:2.1.0”

Android改版(点击按钮时调用uploadFile方法)

 public interface UploadAPIs {
    @Multipart
    @POST("FileUpload")
    Call<ResponseBody> uploadFile(
            @Part ("description") RequestBody description,
            @Part MultipartBody.Part file);
}

public Boolean uploadFile(File file) {
RequestBody descriptionPart = RequestBody.create(MultipartBody.FORM, file.getName());

RequestBody filePart = RequestBody.create(MediaType.parse("image/gif"), file);
MultipartBody.Part fileMulti = MultipartBody.Part.createFormData("file"
, file.getName(), filePart);

Retrofit.Builder builder = new Retrofit.Builder()
        .baseUrl("http://xxxxxxxxxx/api/FileExplorerApi/")
        .addConverterFactory(GsonConverterFactory.create());

Retrofit retrofit = builder.build();

UploadAPIs uploadAPIs = retrofit.create(UploadAPIs.class);

Call<ResponseBody> call = uploadAPIs.uploadFile(descriptionPart, fileMulti);
call.enqueue(new Callback() {
    @Override
    public void onResponse(Call call, Response response) {
        if (!response.isSuccessful()) {
            // Handle the error
            String error = response.errorBody().toString();
            return false;
        }else{
            String responseStr = response.body().toString();
            return true;
        }
    }
    @Override
    public void onFailure(Call call, Throwable t) {
    }
});
}

Android okhttp3(点击按钮时调用uploadFile方法)

public Boolean uploadFile(File file) {  
    OkHttpClient client = new OkHttpClient();
    RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
            .addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("multipart/form-data"), file))
            .build();

    Request request = new Request.Builder()
            .url("http://xxxxxxxxxx/api/FileExplorerApi/FileUpload")
            .post(body)
            .addHeader("content-type", "multipart/form-data")
            .addHeader("Content-Type", "multipart/form-data,image/gif")
            .addHeader("cache-control", "no-cache")
            .addHeader("Postman-Token", "58564c84-b8a7-4455-b346-4606ce696675")
            .build();

    client.newCall(request).enqueue(new Callback() {

        @Override
        public void onFailure(final Call call, final IOException e) {
            // Handle the error
        }

        @Override
        public void onResponse(final Call call, final Response response) throws IOException {
            if (!response.isSuccessful()) {
                // Handle the error
                return false;
            }else{
                String responseStr = response.body().string();
                return true;
            }
            // Upload successful
        }
    });
}

.NET Web Api(Web Api控制器)

[HttpPost]
[Route("~/FileExplorerApi/FileUpload")]        
public HttpResponseMessage Upload()
{

    var request = HttpContext.Current.Request;            
    var file = request.Files["file"];

    string filename = DateTime.Now.ToString("yyyyMMddHHmmssFFF_") + file.FileName;

    file.SaveAs(@"c:\Projects\FileExplorer\Gif\" + filename);

    return new HttpResponseMessage(HttpStatusCode.OK);
}


共1个答案

匿名用户

终于有了答案。我的.NET项目是MVC现有的web项目。我在项目中添加了API控制器,这就是为什么我会遇到这个问题的原因。我想邮递员的结果是好的,安卓也应该是好的。我的解决方案是创建新的仅.NET web API项目。

以下答案只是为了我的改进而分享。
我更改了新的HTTP客户端loopj库,使其比以前的两个库都更容易。

RequestParams params = new RequestParams();

try {
    params.put("file", file);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
AsyncHttpClient client = new AsyncHttpClient();
client.post("http://xxxxxxxxxx/api/FileExplorerApi/Upload?sub=Boomerang", params, new AsyncHttpResponseHandler() {

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
        System.out.println("statusCode "+statusCode);//statusCode 200
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

    }
});

我将上传一个很大的文件,为什么我需要在.NET MVC web API项目进行配置。上载升级文件需要执行以下配置。(web.config)

<system.web>    
    <httpRuntime maxRequestLength="2097152"/>    
</system.web>
<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="1073741824"/>
      </requestFiltering>
    </security>
<system.webServer>