2015-10-07 24 views
7

Tôi muốn tải lên tệp hình ảnh mutliple bằng cách sử dụng HttpURLConnection và số lượng hình ảnh không được cố định với số lượng tệp tải lên từ Android.Tải lên nhiều tệp hình ảnh bằng cách sử dụng HttpURLConnection

Vui lòng không gửi liên kết MultiPartEntity.I chỉ muốn thực hiện việc này bằng cách sử dụng HttpURLConnection và không muốn sử dụng bất kỳ thư viện bên ngoài nào khác để tải lên tệp.

tôi muốn tải lên tập tin sử dụng HTTPUrlConnection ví dụ vui lòng tham khảo link này

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

này là dành cho đơn mã tập tin tải lên tôi muốn tải lên nhiều

Và làm hài lòng những ví dụ về php script.

+1

Hãy thử điều này http://www.codejava.net/java-se/networking/upload-files-by-sending-multipart-request- lập trình bằng cách sử dụng HttpURLConnection. –

+0

Nhưng triển khai bên PHP là gì. –

+0

Vui lòng tham khảo phần này cho http://stackoverflow.com/questions/26686806/httpurlconnection-to-send-image-audio-and-video-files-with-parameter-may-stri HOẶC http: // sunil-android .blogspot.in/2013/09/file-upload-on-php-server-in-android.html HOẶC http://www.coderzheaven.com/2012/04/26/upload-image-android-device-server -method-4/ –

Trả lời

13

Có cuối cùng tôi đã nhận được câu trả lời.

Ở bên 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; 
    } 
} 

Mở tập tin MainActivity

Trên mainactivity.java chỉ cần gọi chức năng này và imgPaths là mảng của con đường hình ảnh.

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

Tôi đang sử dụng Dot net api để tải lên hình ảnh và trường nhưng tôi nhận được loại lỗi này {"Message": "Việc xử lý yêu cầu HTTP dẫn đến ngoại lệ. Vui lòng xem phản hồi HTTP được trả về bởi thuộc tính 'Phản hồi' của ngoại lệ này để biết chi tiết. "} –

+1

CẢM ƠN QUÝ VỊ NHIỀU CÂU TRẢ LỜI NÀY! Tôi đã tìm kiếm câu trả lời này trong khoảng 3 tuần nay! NÓ ĐÃ LÀM VIỆC! :) – edwinj

+0

@akhil batlawala nếu tôi muốn gửi một chuỗi với hình ảnh xin vui lòng cho tôi biết những gì tất cả các thay đổi tôi cần phải thực hiện –

Các vấn đề liên quan