Android загрузить GIF-файл в .net веб-API получил внутреннюю ошибку сервера - PullRequest
0 голосов
/ 13 марта 2019

Я тестировал .net, веб-API с почтальоном работает, но я стараюсь использовать okhttp3 и retrofit2 в Android.Они оба получили внутреннюю ошибку сервера 500 .Что не так?Что мне делать?

Gradle

реализация 'com.squareup.okhttp3: okhttp: 3.4.1'

реализация 'com.squareup.okhttp3: запись-перехватчик: 3.4.1 '

реализация' com.squareup.retrofit2: модификация: 2.3.0 '

реализация' com.squareup.retrofit2: 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Режим отладки в студии) code=500 internal server error

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 (контроллер веб-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);
}

Результат почтальона enter image description here

1 Ответ

0 голосов
/ 13 марта 2019

Наконец-то я получил ответ. Мой .net проект - это существующий веб-проект MVC. Я добавил контроллер API в этот проект, поэтому у меня возникла эта проблема. Я думал, что почтальон результат хорошо, Android также должно быть хорошо. Мое решение заключается в создании нового проекта .net только для веб-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) {

    }
});

Я буду загружать файл большого размера, поэтому мне нужно выполнить настройку в проекте веб-API .net MVC. Для загрузки файла увеличенного размера необходимо выполнить следующую настройку. (Web.config)

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