Только последний файл выполняется в цикле for в PHP при передаче массива файлов из Android с помощью модификации - PullRequest
0 голосов
/ 28 ноября 2018

Я отправляю массив изображений на сервер с Android.Когда я пытаюсь загрузить каждый из них в свою базу данных, загружается только последнее изображение.Я хочу, чтобы каждое из изображений было загружено в таблицу базы данных в виде отдельной строки.Может кто-нибудь понять, где проблема для меня.Спасибо всем.

вот мой скрипт php:

  $total = count($_FILES['images']['name']);

for( $i=0 ; $i <= $total ; $i++ ) {

    $tmpFilePath = $_FILES['images']['tmp_name'];

    $extension = pathinfo($_FILES['images']['name'],PATHINFO_EXTENSION);

    $file_url = $url . getFileName() . '.' . $extension;
    $file_path = $path . getFileName() . '.' . $extension;

    if ($tmpFilePath != ""){

        if(move_uploaded_file($tmpFilePath, $file_path)) {


            $sql = "INSERT INTO posts_media_files (url, post_id) VALUES ('$file_url','$id_bind');";
            $stm = $con1->prepare($sql);

            $stm->execute();

        }

    }


}

вот мой код Android:

Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(Constants.ROOT_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(new OkHttpClient())
                    .build();

            MultipartBody.Part[] imageArray = new MultipartBody.Part[imagePaths.size()];


            for (int i = 0; i < imagePaths.size(); i++) {

                File file = new File(imagePaths.get(i));

                RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file);


                imageArray[i] = MultipartBody.Part.createFormData("images", file.getName(), requestBody);
            }

            RequestBody requestEmail = RequestBody.create(MediaType.parse("text/plain"), userEmail);

            MultipartBody.Part email = MultipartBody.Part.createFormData("email", userEmail, requestEmail);

            RetrofitApi service = retrofit.create(RetrofitApi.class);
            Call<ResponseBody> call = service.uploadFileMultilPart(imageArray, email);

            call.enqueue(new Callback<ResponseBody>() {
                @Override
                public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

                }

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

                    Toast.makeText(PostActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
                }

            });
        }

и вот мой модифицированный интерфейс:

    @Multipart
    @POST("post_image.php")
    Call<ResponseBody> uploadFileMultilPart(@Part MultipartBody.Part[] images, @Part MultipartBody.Part email);

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Проблема была с моим кодом Android: я должен был добавить этот знак [] к имени моего массива изображений, так что теперь должно быть,

 imageArray[i] = MultipartBody.Part.createFormData("images[]", file.getName(), requestBody);

конечно, мне нужно былотакже вместе с этим решением последовало решение @Nigel Ren.Спасибо @ Найджел Рен.

0 голосов
/ 28 ноября 2018

Когда вы получаете доступ к различным значениям $_FILE - хотя вы в цикле, вы всегда ссылаетесь на один и тот же элемент ...

$tmpFilePath = $_FILES['images']['tmp_name'];

, вы должны ссылаться на каждый элемент, используя переменную цикла ($i) ...

$tmpFilePath = $_FILES['images']['tmp_name'][$i];

Делайте то же самое с каждой ссылкой на $_FILE.

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