Android позволяет загружать несколько файлов (максимум 150 МБ) на PHP Server

Я должен разрешить пользователю загружать несколько файлов (может быть изображение / видео / аудио) в одном запросе из моего приложения Android на сервер PHP. Я использую веб-службу REST.

Для этой функции я использую следующий код:

/* To upload the multiple documents */ public void uploadFile() { String charset = "UTF-8"; File[] uploadFileArray = new File[mediaList.size()]; for (int i = 0; i < mediaList.size(); i++) { uploadFileArray[i] = new File(mediaList.get(i).getMediaPath()); } try { MultipartUtility multipart = new MultipartUtility(upLoadServerUri, charset); for (int i = 0; i < mediaList.size(); i++) { if (isImage)) { multipart.addFilePart("image_doc[]", uploadFileArray[i]); } else if (isVideo) { multipart.addFilePart("video_doc[]", uploadFileArray[i]); } else if (isAudio) { multipart.addFilePart("audio_doc[]", uploadFileArray[i]); } } List<String> responseUploadDocument = multipart.finish(); System.out.println("SERVER REPLIED:"); for (String line : responseUploadDocument) { System.out.println(line); responseUploadDocumentString = line; } if (responseUploadDocumentString != null) { JSONObject jsonObj = new JSONObject(responseUploadDocumentString); statusUploadDoc = jsonObj.getString("status"); } } catch (Exception e) { e.printStackTrace(); } } 

И мой класс MultipartUtility выглядит следующим образом:

 public class MultipartUtility { private final String boundary; private static final String LINE_FEED = "\r\n"; private HttpURLConnection httpConn; private String charset; private OutputStream outputStream; private PrintWriter writer; public MultipartUtility(String requestURL, String charset) throws IOException { this.charset = charset; boundary = "===" + System.currentTimeMillis() + "==="; URL url = new URL(requestURL); httpConn = (HttpURLConnection) url.openConnection(); ***httpConn.setChunkedStreamingMode(0);*** httpConn.setUseCaches(false); httpConn.setDoOutput(true); // indicates POST method httpConn.setDoInput(true); httpConn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); httpConn.setRequestProperty("User-Agent", "CodeJava Agent"); httpConn.setRequestProperty("Test", "Bonjour"); outputStream = httpConn.getOutputStream(); writer = new PrintWriter(new OutputStreamWriter(outputStream, charset), true); } public void addFormField(String name, String value) { writer.append("--" + boundary).append(LINE_FEED); writer.append("Content-Disposition: form-data; name=\"" + name + "\"") .append(LINE_FEED); writer.append("Content-Type: text/plain; charset=" + charset).append( LINE_FEED); writer.append(LINE_FEED); writer.append(value).append(LINE_FEED); writer.flush(); } public void addFilePart(String fieldName, File uploadFile) throws IOException { String fileName = uploadFile.getName(); writer.append("--" + boundary).append(LINE_FEED); writer.append( "Content-Disposition: form-data; name=\"" + fieldName + "\"; filename=\"" + fileName + "\"") .append(LINE_FEED); writer.append( "Content-Type: " + URLConnection.guessContentTypeFromName(fileName)) .append(LINE_FEED); writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED); writer.append(LINE_FEED); writer.flush(); FileInputStream inputStream = new FileInputStream(uploadFile); byte[] buffer = new byte[4096]; int bytesRead = -1; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.flush(); inputStream.close(); writer.append(LINE_FEED); writer.flush(); } public void addHeaderField(String name, String value) { writer.append(name + ": " + value).append(LINE_FEED); writer.flush(); } public List<String> finish() throws IOException { List<String> response = new ArrayList<String>(); writer.append(LINE_FEED).flush(); writer.append("--" + boundary + "--").append(LINE_FEED); writer.close(); // checks server's status code first int status = httpConn.getResponseCode(); if (status == HttpURLConnection.HTTP_OK) { BufferedReader reader = new BufferedReader(new InputStreamReader( httpConn.getInputStream())); String line = null; while ((line = reader.readLine()) != null) { response.add(line); } reader.close(); httpConn.disconnect(); } else { throw new IOException("Server returned non-OK status: " + status); } return response; } } 

Но теперь проблема заключается в следующем:

На локальном сервере:

  • Разрешить загрузку до 16 МБ [если setChunkedStremmingMode (0) не установлен]
  • Разрешить загрузку до 150 МБ [если установлен setChunkedStremmingMode (0)]

На Live Server:

  • Разрешить загрузку до 16 МБ [если setChunkedStremmingMode (0) не установлен]
  • Запретить загрузку одного файла KB [если установлен setChunkedStremmingMode (0)]

Мои локальные и живые серверы имеют одинаковые конфигурации. Я не понимаю, почему setChunkedStremmingMode (0) не работает для реального сервера.

Проверьте эти два параметра в файле php.ini на своем сервере, который обрабатывает загрузку файлов.

 ; Maximum allowed size for uploaded files. upload_max_filesize = 150M ; Must be greater than or equal to upload_max_filesize post_max_size = 150M 

Вам необходимо сначала выполнить эти настройки на своем сервере, тогда только большая загрузка файла будет работать правильно. Также проверьте настройки на локальном сервере. Эти настройки важнее, прежде чем писать код, чтобы обрабатывать загрузку, потому что ваш код соответствует мне, поскольку загрузка файлов работает на вас. Проблема, похоже, связана с настройками php.ini ….

У меня есть проект, который может загружать изображение / размер файла до 48-50 МБ . [Я использую Retrofit для сетевой связи.] Вот ссылка на пример проекта: https://github.com/DearDhruv/Retrofit-with-EventBus

Вот код:

 private void startUploading(final File file) { if (file == null || !isPictureValid(file.getAbsolutePath())) { showMsg("File is not valid, try again."); } else if (file.exists()) { showProgressDialog(); String mimeType = "image/jpeg" // "application/octet-stream" // "multipart/form-data" // "image/*" // "multipart/mixed" ; TypedFile typedFile = new TypedFile(mimeType, file); mApiClient.uploadFile(UPLOAD_FILE_REQUEST_TAG, typedFile); } else { showMsg("File is corrupted."); } } 

Вот код на стороне сервера:

 class ImageUploadStatus { public $result_code = 0; public $message = "Image upload failed.";} class ImageResults { public $name = ""; public $url = ""; public $size = ""; } $status = new ImageUploadStatus (); $results = new ImageResults (); if ($_FILES ["file"] ["error"] > 0) { header ( "HTTP/1.1 400 Bad Request" ); // echo "Error: " . $_FILES ["file"] ["error"] . "<br /> \n"; $status->message = "Error: " . $_FILES ["file"] ["error"]; } else { if ($_FILES ["file"] ["error"] > 0) { // echo "Error: " . $_FILES ["file"] ["error"] . "<br /> \n"; $status->message = "Error: " . $_FILES ["file"] ["error"]; } else { // echo "Upload: " . $_FILES ["file"] ["name"] . "<br /> \n"; // echo "Type: " . $_FILES ["file"] ["type"] . "<br /> \n"; // echo "Size: " . ($_FILES ["file"] ["size"] / 1024) . " Kb<br /> \n"; // echo "Stored in: " . $_FILES ["file"] ["tmp_name"] . "<br /> \n"; } $target_path = "../api/uploads/"; $target_path = $target_path . basename ( $_FILES ['file'] ['name'] ); //if (is_uploaded_file ( $_FILES ['uploadedfile'] ['tmp_name'] )) { // echo "There was an error uploading the file, please try again!"; //$status->message = "There was an error uploading the file, please try again!"; //} if (move_uploaded_file ( $_FILES ['file'] ['tmp_name'], $target_path )) { // echo "The file " . basename ( $_FILES ['file'] ['name'] ) . " has been uploaded"; $status->message = "Image upload successful"; $status->result_code = 1; $results->name = $_FILES ["file"] ["name"] . ""; $results->url = $target_path . ""; $results->size = ($_FILES ["file"] ["size"] / 1); // 1024 to convert in KB } else { // echo "There was an error Moving the file, please try again!"; //$status->message = "There was an error Moving the file, please try again!"; switch($_FILES['file']['error']){ case 0: //no error; possible file attack! $status->message = "There was a problem with your upload."; break; case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini $status->message = "The file you are trying to upload is too big."; break; case 2: //uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form $status->message = "The file you are trying to upload is too big."; break; case 3: //uploaded file was only partially uploaded $status->message = "The file you are trying upload was only partially uploaded."; break; case 4: //no file was uploaded $status->message = "You must select an image for upload."; break; default: //a default error, just in case! :) $status->message = "There was a problem with your upload."; break; } } $response = array ( 'status' => $status, 'results' => $results ); // echo (json_encode ( $status )); // echo (json_encode ( $results )); echo (json_encode ( $response )); } 

Думаю, это может быть полезно.

Вам также может потребоваться указать максимальный размер загружаемого файла в настройках PHP.