Как правильно загрузить файл на сервер Laravel с устройства Android, используя Retrofit - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь загрузить изображение из Android Studio на сервер Laravel, используя многокомпонентное кодирование Retrofit2, но я получаю сообщение «500 Internal Server Error», что означает, что что-то идет не так на стороне сервера, вероятно, но я не могу закрепить что это такое.

это мой интерфейсный вызов (Android Studio):

@Multipart
@POST("public/imagem")
Call<ResponseBody> uploadImagem(@Part MultipartBody.Part part,
                                @Part("name") RequestBody name,
                                @Part("animal_id") long animal_id,
                                @Part("ativo") int ativo);

это запрос (Android Studio):

    //Create a file object using file path
    File file = new File(filePath);
    // Create a request body with file and image media type
    RequestBody fileReqBody = RequestBody.create(MediaType.parse("image/*"), file);
    // Create MultipartBody.Part using file request-body,file name and part name
    MultipartBody.Part part = MultipartBody.Part.createFormData("upload", file.getName(), fileReqBody);
    //Create request body with text description and text media type
    RequestBody name = RequestBody.create(MediaType.parse("text/plain"), "image-type");

    WebService.getInstance().getService().uploadImagem(part, name, animal_id, 1).enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            if (response.isSuccessful()) {
                //THIS IS WHERE I WANT TO GET
            } else {
                //THIS IS WHERE IM GETTING AT EVERYTIME
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {

        }
    });

это мой маршрут (Laravel):

Route::post('imagem','ImagemController@createImagem');

это функция createImagem внутри ImagemController (Laravel):

public function createImagem(Request $request){

$destinationPath = url('/midia'); //i have a "midia" folder inside "public" folder
$image = $request->file('part');
$name = $request->input('name');
$image->move($destinationPath, $name);

$dbPath = $destinationPath. '/'.$name;
$imagem = new Imagem();
$imagem->animal_id = $request->input('animal_id');
$imagem->img_url = $dbPath;
$imagem->ativo = $request->input('ativo');   
$imagem->save();

return response()->json($imagem);
}

а это атрибуты внутри таблицы "Imagem" и их типы:

но я получаю 500 Internal Server Error, так что, вероятно, что-то на стороне сервера не соответствует тому, что было бы логически правильно, вы можете помочь мне найти, что не так в моем коде?

пс. У меня есть другие запросы к этому серверу, которые являются полностью функциональными, но все они - просто поля, в то время как у этого есть файл, который требует многочастного кодирования, в отличие от других.

EDIT: Это журнал ошибок сервера:

[2019-06-11 21:21:03] local.ERROR: Call to a member function move() on null {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Call to a member function move() on null at /.../Controllers/ImagemController.php:28)

Кажется, я не могу получить файл с

$image = $request->file('part');

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

Я думаю, что ошибка может быть из-за того, что путь должен быть путем, а не URL:

$destinationPath = url('/midia');

Если вы хотите переместить файл в общую папку, вы должны использовать public_path() дляпуть:

$image = $request->file('part');
$destinationPath = 'midia';
$name = $request->input('name') .'.'. $image->getClientOriginalExtension();
$image->move(public_path($destinationPath), $name);

Если вы хотите избежать ошибки и не тратить ресурсы сервера, когда в запросе нет изображения, добавьте проверку в начале вашей функции:

public function createImagem(Request $request){
    $this->validate($request, [
        'part' => 'required|image|max:2048',
        // other fields validations
    ]);
    // the createImagem logic here
}

если проверка не пройдена, вы не будете пытаться переместить файл и не будете запрашивать БД, тогда правильный ответ об ошибке будет автоматически отправлен обратно клиенту, где вы сможете его обработать.

1 голос
/ 12 июня 2019

попробуйте этот код, надеюсь, он будет вам полезен.

 @Multipart
@POST("public/imagem")
Call<ResponseBody> uploadImagem(@Part MultipartBody.Part part);

, если вы используете ключевую часть $image = $request->file('part');

, также используйте эту "часть" ключа в коде Java

Uri uri1 = Uri.parse(event_image);
        File file = new File(uri1.getPath());
        RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), file);

        MultipartBody.Part image = MultipartBody.Part.createFormData("part", file.getName(), reqFile);



        mService.addEvent(image).enqueue(new Callback<LoginResponse>() {
            @Override
            public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {

            }

            @Override
            public void onFailure(Call<LoginResponse> call, Throwable t) {

            }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...