Android: ¿Cómo subir un archivo .mp3 al servidor http?

Quiero subir el archivo .mp3 (solo) desde el dispositivo a mi servidor.

Quiero navegar por la ruta de los datos multimedia y seleccionar cualquier archivo mp3 y subirlo.

¿Cómo puedo hacer esto?

Mi último código JAVA y PHP para cargar un archivo desde la tarjeta SD de Android a mi propio servidor web.

El código de Java / Android:

private void doFileUpload() { HttpURLConnection conn = null; DataOutputStream dos = null; DataInputStream inStream = null; String existingFileName = Environment.getExternalStorageDirectory().getAbsolutePath() + "/mypic.png"; String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 1 * 1024 * 1024; String responseFromServer = ""; String urlString = "http://mywebsite.com/directory/upload.php"; try { //------------------ CLIENT REQUEST FileInputStream fileInputStream = new FileInputStream(new File(existingFileName)); // open a URL connection to the Servlet URL url = new URL(urlString); // Open a HTTP connection to the URL conn = (HttpURLConnection) url.openConnection(); // Allow Inputs conn.setDoInput(true); // Allow Outputs conn.setDoOutput(true); // Don't use a cached copy. conn.setUseCaches(false); // Use a post method. conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); dos = new DataOutputStream(conn.getOutputStream()); dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + existingFileName + "\"" + lineEnd); dos.writeBytes(lineEnd); // create a buffer of maximum size bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); buffer = new byte[bufferSize]; // read file and write it into form... bytesRead = fileInputStream.read(buffer, 0, bufferSize); while (bytesRead > 0) { dos.write(buffer, 0, bufferSize); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); bytesRead = fileInputStream.read(buffer, 0, bufferSize); } // send multipart form data necesssary after file data... dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); // close streams Log.e("Debug", "File is written"); fileInputStream.close(); dos.flush(); dos.close(); } catch (MalformedURLException ex) { Log.e("Debug", "error: " + ex.getMessage(), ex); } catch (IOException ioe) { Log.e("Debug", "error: " + ioe.getMessage(), ioe); } //------------------ read the SERVER RESPONSE try { inStream = new DataInputStream(conn.getInputStream()); String str; while ((str = inStream.readLine()) != null) { Log.e("Debug", "Server Response " + str); } inStream.close(); } catch (IOException ioex) { Log.e("Debug", "error: " + ioex.getMessage(), ioex); } } 

El código PHP asociado para ir a su servidor (upload.php):

  

Cosas a tener en cuenta.
1) Tenía “mypic.png” dentro del directorio raíz de la tarjeta SD. Como en, si miras el dispositivo Android a través de la vista USB de almacenamiento masivo, colocarías el archivo en el primer directorio que encuentres.

2) ¡EL ALMACENAMIENTO MASIVO USB DEBE APAGARSE EN EL TELÉFONO! O simplemente desenchúfela completamente de la computadora en la que está escribiendo el código para asegurar que este sea el caso.

3) Tuve que crear una carpeta de “cargas” en el mismo directorio que mi archivo php.

4) Obviamente, debe cambiar la dirección web que escribí como http://mywebsite.com/directory/upload.php para que sea su propio sitio web.

Gracias por la buena sugerencia Keaton.

He arreglado un poco el código de Java para que esté listo para usar y para agregar compatibilidad con otros parámetros de URL:

 public class HttpMultipartUpload { static String lineEnd = "\r\n"; static String twoHyphens = "--"; static String boundary = "AaB03x87yxdkjnxvi7"; public static String upload(URL url, File file, String fileParameterName, HashMap parameters) throws IOException { HttpURLConnection conn = null; DataOutputStream dos = null; DataInputStream dis = null; FileInputStream fileInputStream = null; byte[] buffer; int maxBufferSize = 20 * 1024; try { //------------------ CLIENT REQUEST fileInputStream = new FileInputStream(file); // open a URL connection to the Servlet // Open a HTTP connection to the URL conn = (HttpURLConnection) url.openConnection(); // Allow Inputs conn.setDoInput(true); // Allow Outputs conn.setDoOutput(true); // Don't use a cached copy. conn.setUseCaches(false); // Use a post method. conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); dos = new DataOutputStream(conn.getOutputStream()); dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"" + fileParameterName + "\"; filename=\"" + file.toString() + "\"" + lineEnd); dos.writeBytes("Content-Type: text/xml" + lineEnd); dos.writeBytes(lineEnd); // create a buffer of maximum size buffer = new byte[Math.min((int) file.length(), maxBufferSize)]; int length; // read file and write it into form... while ((length = fileInputStream.read(buffer)) != -1) { dos.write(buffer, 0, length); } for (String name : parameters.keySet()) { dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"" + name + "\"" + lineEnd); dos.writeBytes(lineEnd); dos.writeBytes(parameters.get(name)); } // send multipart form data necessary after file data... dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); dos.flush(); } finally { if (fileInputStream != null) fileInputStream.close(); if (dos != null) dos.close(); } //------------------ read the SERVER RESPONSE try { dis = new DataInputStream(conn.getInputStream()); StringBuilder response = new StringBuilder(); String line; while ((line = dis.readLine()) != null) { response.append(line).append('\n'); } return response.toString(); } finally { if (dis != null) dis.close(); } } } 

Tenga en cuenta que si copia y pega los códigos PHP anteriores, cualquiera puede cargar un script PHP malicioso en su servidor y ejecutarlo, siempre tenga en cuenta eso, consulte las extensiones SERVER SIDE con PHP. Hay miles de ejemplos aquí y en la web sobre cómo hazlo. Además, para mayor seguridad, agregue reglas a su servidor apache, nginx para agregar encabezado Content-Disposition (jpg, png, gif, ???) y para NO analizar el código PHP en la carpeta de carga.

en nxgin, por ejemplo, sería algo como esto …

 #add header Content-Disposition location ^~ /upload/pictures { default_type application/octet-stream; types { image/gif gif; image/jpeg jpg; image/png png; } add_header X-Content-Type-Options 'nosniff'; if ($request_filename ~ /(((?!\.(jpg)|(png)|(gif)$)[^/])+$)) { add_header Content-Disposition 'attachment; filename="$1"'; # Add X-Content-Type-Options again, as using add_header in a new context # dismisses all previous add_header calls: add_header X-Content-Type-Options 'nosniff'; } } #do NOT parse PHP script on the upload folder location ~ \.php$ { try_files $uri =404; include /etc/nginx/fastcgi_params; #if is the upload folder DO NOT parse PHP scripts on it if ($uri !~ "^/upload/pictures") { fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket; } fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } 

Sé que esto fue preguntado un rato atrás. Estaba intentando implementar lo mismo y después de probar muchas soluciones, descubrí que el código de @Keaton me funciona, pero estaba bloqueando mi UI (estoy usando Android Studio 2.1.2), así que tuve que envolverlo en un AsyncTask.

Entonces, usando el código de @Keaton tengo esto.

De mi onClickListener ()

 private View.OnClickListener btnUpload = new View.OnClickListener() { @Override public void onClick(View v) { new doFileUpload().execute(); } }; 

Luego, la AsyncTask

 public class doFileUpload extends AsyncTask { @Override protected Void doInBackground(Void... params) {  return null; } } 

Espero que esto ayude a cualquiera que tenga el mismo problema que yo.