Загрузить файл изображения в laravel API из android - PullRequest
0 голосов
/ 21 апреля 2020

Я не могу понять, как я могу загрузить файл изображения с моего устройства android в Laravel API с данными POST, я уже отправляю некоторые текстовые данные в API, используя android -asynchronous-http-client, но он не работает с файлами изображений. Конец API работает нормально, я протестировал его с помощью POSTMAN, но выдает ошибку на android устройстве status code: 500 Internal Server Error

ANDROID PART

            RequestParams ComplaintsDataRequestParams = new RequestParams();

            ComplaintsDataRequestParams.put("Complaint_Subject", complaintsSubject.getText().toString());
            ComplaintsDataRequestParams.put("Complaint_Details", complaintsDetails.getText().toString());
            ComplaintsDataRequestParams.put("Complaint_Address", complaintAddress.getText().toString());
            ComplaintsDataRequestParams.put("Username", HomeActivity.home_username);
            ComplaintsDataRequestParams.put("Complainant_CNIC", HomeActivity.user_cnic);
            ComplaintsDataRequestParams.put("Complaint_id", uniqueComplaintID);
            ComplaintsDataRequestParams.put("User_Location", user_complete_address + "-" + lat + "," + lng);

            if (ImageEvidence1 != null) {
                evidenceID1 = uniqueComplaintID + "-" + System.currentTimeMillis();
                ComplaintsDataRequestParams.put("Evidence_ID1", "YES");
                ComplaintsDataRequestParams.put("Evidence_ID1_name", evidenceID1);
                ComplaintsDataRequestParams.put("Evidence_ID1_data", ImageEvidence1);
            }
            if (ImageEvidence2 != null) {
                evidenceID2 = uniqueComplaintID + "-" + System.currentTimeMillis();
                ComplaintsDataRequestParams.put("Evidence_ID2", "YES");
                ComplaintsDataRequestParams.put("Evidence_ID2_name", evidenceID2);
                ComplaintsDataRequestParams.put("Evidence_ID2_data", ImageEvidence2);
            }
            if (ImageEvidence3 != null) {
                evidenceID3 = uniqueComplaintID + "-" + System.currentTimeMillis();
                ComplaintsDataRequestParams.put("Evidence_ID3", "YES");
                ComplaintsDataRequestParams.put("Evidence_ID3_name", evidenceID3);
                ComplaintsDataRequestParams.put("Evidence_ID3_data", ImageEvidence3);
            }



Complaints_REST_API_Client.POST("?action=store", ComplaintsDataRequestParams, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] response) {
                // called when response HTTP status is "200 OK"
                complaint_confirmation();
                Log.d("newComplaintActivity", "statusCode " + statusCode);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable error) {
                // called when response HTTP status is "4XX" (eg. 401, 403, 404)
                submittingComplaint.dismiss();
                Log.d("newComplaintActivity", "statusCode " + statusCode);
                Toast.makeText(getContext(), "Exception: " + error.getMessage(), Toast.LENGTH_SHORT).show();
            }

  });

ImageEvidence является переменной типа Uri, которая используется в imageView.setImageURI(ImageEvidence), а evidenceID - это просто имена файлов изображений.

LARAVEL API PART

            Complaint::create([
                'title' => $request->input('Complaint_Subject'),
                'description' => $request->input('Complaint_Details'),
                'address' => $request->input('Complaint_Address'),
                'firebase_user_id' => $request->input('Username'),
                'firebase_user_cnic' => $request->input('Complainant_CNIC'),
                'firebase_complaint_id' => $request->input('Complaint_id'),
                'firebase_user_location' => $request->input('User_Location'),
                'status' => 'pending'
            ]);

            if ($request->input('Evidence_ID1') == "YES")
                Evidence::create([
                    'evidence_name' => $request->input('Evidence_ID1_name'),
                    'eivdence_image' => $request->file('Evidence_ID1_data')->store('public/evidences'),
                    'complaint_id' => $request->input('Complaint_id')
                ]);

            if ($request->input('Evidence_ID2') == "YES")
                Evidence::create([
                    'evidence_name' => $request->input('Evidence_ID2_name'),
                    'eivdence_image' => $request->file('Evidence_ID2_data')->store('public/evidences'),
                    'complaint_id' => $request->input('Complaint_id')
                ]);

            if ($request->input('Evidence_ID3') == "YES")
                Evidence::create([
                    'evidence_name' => $request->input('Evidence_ID3_name'),
                    'eivdence_image' => $request->file('Evidence_ID3_data')->store('public/evidences'),
                    'complaint_id' => $request->input('Complaint_id')
                ]);

Скажите, пожалуйста, какую библиотеку следует использовать для отправки файла изображения вместе с данными POST.

1 Ответ

0 голосов
/ 22 апреля 2020

Я решил свою проблему с помощью очень простого ярлыка

, когда запрашивал файл в конце API, но отправлял Uri, т.е. ImageEvidence1. Таким образом, простой взлом состоял в том, что я получил абсолютный путь URI и поместил его в файл, а затем

File file = new File(new URI(ImageEvidence1.getPath()));
ComplaintsDataRequestParams.put("Evidence_ID3_data", file);

Вот так оно и было.

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