Android permite múltiples archivos de carga (Max 150 MB) a PHP Server

Tengo que permitir que un usuario cargue archivos múltiples (puede ser imagen / vídeo / audio) en una sola petición de mi androide aplicación al servidor de PHP. Estoy utilizando el servicio web REST.

Para esta funcionalidad, estoy utilizando el código siguiente:

/* 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(); } } 

Y mi clase MultipartUtility es la siguiente:

 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; } } 

Pero ahora el problema es:

En el servidor local:

  • Permitir subir hasta 16MB [si setChunkedStremmingMode (0) no está configurado]
  • Permitir subir hasta 150MB [si se establece setChunkedStremmingMode (0)]

En servidor en vivo:

  • Permitir subir hasta 16MB [si setChunkedStremmingMode (0) no está configurado]
  • Prohibir cargar un único archivo KB [si se establece setChunkedStremmingMode (0)]

Mis servidores locales y en vivo tienen las mismas configuraciones. No entiendo por qué setChunkedStremmingMode (0) no funciona para el servidor en vivo.

2 Solutions collect form web for “Android permite múltiples archivos de carga (Max 150 MB) a PHP Server”

Tengo el proyecto que puede cargar el tamaño de la imagen / del archivo de hasta 48-50 MB . [Estoy usando Retrofit para comunicación en red.] Aquí está el enlace para el proyecto de ejemplo: https://github.com/DearDhruv/AndroidProjectStarter

Aquí está el código de subida : https://github.com/DearDhruv/AndroidProjectStarter/blob/master/project_starter/src/com/deardhruv/projectstarter/activities/UploadFileActivity.java

CÓDIGO:

  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."); } } 

Aquí está el lado del servidor php subir el código : https://github.com/DearDhruv/AndroidProjectStarter/blob/master/3rd_Party/html/php/upload.php

CÓDIGO:

  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 )); } 

Supongo que esto podría ser útil.

También puede ser necesario dar el tamaño máximo del archivo de carga en la configuración de php.

Por favor, compruebe estos dos ajustes en el archivo php.ini en su servidor que maneja la carga del archivo.

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

Usted necesita hacer estos ajustes apropiados primero en su servidor entonces la carga grande del archivo funcionará correctamente. También compruebe la configuración en su servidor local. Estos ajustes son más importantes antes de escribir el código para manejar la carga porque su código es correcto según mí como la carga del archivo está trabajando para usted. El problema parece ser con la configuración de php.ini ….

  • Cómo utilizar el SSL con multi entidad en android
  • Carga de parámetros e imagen a través de HttpURLConnection a un servidor PHP (Android)
  • ¿Cómo administrar sesión para un usuario conectado desde una aplicación móvil en PHP?
  • ¿Por qué el descifrado de AES java devuelve caracteres adicionales?
  • Autenticación de Firebase en el sitio web de wordpress
  • Httpclient desaconsejado
  • ¿Cómo puedo mostrar pdf en html (respuesta / solución de navegación cruzada)
  • Android: Envío de datos para ser almacenados en MySQL
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.