2015-10-07 15 views
7

voglio caricare mutliple file di immagine utilizzando HttpURLConnection, e il numero di immagine non viene fissata al numero di file da caricare da Android.Carica file di immagine multipla usando HttpURLConnection

Si prega di non inviare il link di MultiPartEntity.Io voglio solo questo fatto utilizzando HttpURLConnection e non voglio utilizzare qualsiasi altra libreria esterna per il file di upload.

voglio caricare file utilizzando HttpURLConnection ad esempio si veda questo link

http://www.17od.com/2010/02/18/multipart-form-upload-on-android/

questo è il codice unico upload di file che voglio caricare più

e per favore l'esempio di script php.

+1

Prova questo http://www.codejava.net/java-se/networking/upload-files-by-sending-multipart-request- utilizzando HttpURLConnection al livello di programmazione. –

+0

Ma cos'è l'implementazione lato PHP. –

+0

prega di fare riferimento per questo lato php http://stackoverflow.com/questions/26686806/httpurlconnection-to-send-image-audio-and-video-files-with-parameter-may-stri o http: // Sunil-Android .blogspot.in/2013/09/file-upload-on-php-server-in-android.html OR http://www.coderzheaven.com/2012/04/26/upload-image-android-device-server -method-4/ –

risposta

13

Si finalmente ho ottenuto risposta.

A fianco di Android.

Fileuploader.java

public class FileUploader { 
    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 FileUploader(String requestURL, String charset) 
      throws IOException { 
     this.charset = charset; 

     // creates a unique boundary based on time stamp 
     boundary = "===" + System.currentTimeMillis() + "==="; 

     URL url = new URL(requestURL); 
     httpConn = (HttpURLConnection) url.openConnection(); 
     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); 
    } 

    /** 
    * Adds a form field to the request 
    * @param name field name 
    * @param value field value 
    */ 
    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(); 
    } 

    /** 
    * Adds a upload file section to the request 
    * @param fieldName name attribute in <input type="file" name="..." /> 
    * @param uploadFile a File to be uploaded 
    * @throws IOException 
    */ 
    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(); 
    } 

    /** 
    * Adds a header field to the request. 
    * @param name - name of the header field 
    * @param value - value of the header field 
    */ 
    public void addHeaderField(String name, String value) { 
     writer.append(name + ": " + value).append(LINE_FEED); 
     writer.flush(); 
    } 

    /** 
    * Completes the request and receives response from the server. 
    * @return a list of Strings as response in case the server returned 
    * status OK, otherwise an exception is thrown. 
    * @throws IOException 
    */ 
    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; 
    } 
} 

in archivio mainactivity

Sulla mainactivity.java chiamare questa funzione e imgPaths è matrice di percorso immagini.

public void uploadFile(ArrayList<String> imgPaths) { 

     String charset = "UTF-8"; 
     //File uploadFile1 = new File("e:/Test/PIC1.JPG"); 
     //File uploadFile2 = new File("e:/Test/PIC2.JPG"); 

     File sourceFile[] = new File[imgPaths.size()]; 
     for (int i=0;i<imgPaths.size();i++){ 
      sourceFile[i] = new File(imgPaths.get(i)); 
      // Toast.makeText(getApplicationContext(),imgPaths.get(i),Toast.LENGTH_SHORT).show(); 
     } 

     String requestURL = "your API"; 

     try { 
      FileUploader multipart = new FileUploader(requestURL, charset); 

      multipart.addHeaderField("User-Agent", "CodeJava"); 
      multipart.addHeaderField("Test-Header", "Header-Value"); 

      multipart.addFormField("description", "Cool Pictures"); 
      multipart.addFormField("keywords", "Java,upload,Spring"); 

      for (int i=0;i<imgPaths.size();i++){ 
       multipart.addFilePart("uploaded_file[]", sourceFile[i]); 
      } 

      /*multipart.addFilePart("fileUpload", uploadFile1); 
      multipart.addFilePart("fileUpload", uploadFile2);*/ 

      List<String> response = multipart.finish(); 

      System.out.println("SERVER REPLIED:"); 

      for (String line : response) { 
       System.out.println(line); 
      } 
     } catch (IOException ex) { 
      System.err.println(ex); 
     } 
    } 

uploader.php

foreach ($_FILES["uploaded_file"]["error"] as $key => $error) { 
    if ($error == UPLOAD_ERR_OK) { 
     $tmp_name = $_FILES["uploaded_file"]["tmp_name"][$key]; 
     $name = $_FILES["uploaded_file"]["name"][$key]; 
    $file_path = "../post_uploaded_images/"; 
     $file_path = $file_path . $name; 
      if(@move_uploaded_file($tmp_name, $file_path)) 
      { 
       echo "success"; 

      } else{ 

       echo "fail"; 
      } 
    } 
} 
+1

Sto usando Dot net api per caricare l'immagine e il campo, ma sto ricevendo questo tipo di errore {"Messaggio": "L'elaborazione della richiesta HTTP ha provocato un'eccezione. Vedi la risposta HTTP restituita dalla proprietà 'Response' di questa eccezione per i dettagli. "} –

+1

GRAZIE GRAZIE PER QUESTA RISPOSTA! Ho cercato questa risposta per circa 3 settimane ora! HA FUNZIONATO! :) – edwinj

+0

@akhil batlawala cosa succede se voglio inviare una stringa con le immagini per favore fatemi sapere che cosa tutte le modifiche ho bisogno di fare –