2013-06-18 34 views
15

Tôi đang cố gắng gửi một hình ảnh đến một trang web bằng cách sử dụng các yêu cầu POST HTTP của Java.Gửi tập tin hình ảnh bằng cách sử dụng các kết nối HTTP HTTP HTTP

Tôi đang sử dụng mã cơ sở sử dụng ở đây Upload files from Java client to a HTTP server:

Đây là sửa đổi của tôi:

String urlToConnect = "http://localhost:9000/upload"; 
File fileToUpload = new File("C:\\Users\\joao\\Pictures\\bla.jpg"); 
String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value. 

URLConnection connection = new URL(urlToConnect).openConnection(); 
connection.setDoOutput(true); // This sets request method to POST. 
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); 
PrintWriter writer = null; 
try { 
    writer = new PrintWriter(new OutputStreamWriter(connection.getOutputStream())); 
    writer.println("--" + boundary); 
    writer.println("Content-Disposition: form-data; name=\"picture\"; filename=\"bla.jpg\""); 
    writer.println("Content-Type: image/jpeg"); 
    writer.println(); 
    BufferedReader reader = null; 
    try { 
     reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileToUpload))); 
     for (String line; (line = reader.readLine()) != null;) { 
      writer.println(line); 
     } 
    } finally { 
     if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {} 
    } 
    writer.println("--" + boundary + "--"); 
} finally { 
    if (writer != null) writer.close(); 
} 

// Connection is lazily executed whenever you request any status. 
int responseCode = ((HttpURLConnection) connection).getResponseCode(); 
System.out.println(responseCode); // Should be 200 

tôi nhận được một mã số 200 phản ứng cuối cùng, nhưng hình ảnh là buggy, như trong, màu sắc ngẫu nhiên, khiến tôi nghĩ rằng đó là lỗi trong mã hóa ký tự. Tôi đã thử sử dụng UTF-8 như trong ví dụ ban đầu, nhưng điều đó chỉ tạo ra một hình ảnh bị hỏng.

Tôi cũng chắc chắn 100% đó không phải là vấn đề của máy chủ, vì tôi có thể sử dụng các ứng dụng khách còn lại như Advanced Rest Client/Postman và họ có thể gửi hình ảnh mà không gặp vấn đề gì.

Bạn có thể giúp tôi xác định điều gì sai? Cảm ơn bạn.

+0

nghĩ bạn nên thêm tham số 'Content-Transfer-Encoding: binary', kể từ khi tải lên cần được xử lý dưới dạng nhị phân. –

+0

Có thể vấn đề là vì bạn đang sử dụng BufferedReader.readLine() để tải hình ảnh ?? Tất nhiên bạn tìm thấy hình ảnh "lỗi" bởi vì bạn chỉ cần sử dụng InputStream.read (byte, 0, bytes.length) và sau đó outputStream.write (byte) trong đó outputStream là connection.getOutputStream(); –

Trả lời

16
import java.io.File; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.HttpVersion; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.mime.MultipartEntity; 
import org.apache.http.entity.mime.content.ContentBody; 
import org.apache.http.entity.mime.content.FileBody; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.params.CoreProtocolPNames; 
import org.apache.http.util.EntityUtils; 


public class PostFile { 
    public static void main(String[] args) throws Exception { 
    HttpClient httpclient = new DefaultHttpClient(); 
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 

    HttpPost httppost = new HttpPost("http://localhost:9000/upload"); 
    File file = new File("C:\\Users\\joao\\Pictures\\bla.jpg""); 

    MultipartEntity mpEntity = new MultipartEntity(); 
    ContentBody cbFile = new FileBody(file, "image/jpeg"); 
    mpEntity.addPart("userfile", cbFile); 


    httppost.setEntity(mpEntity); 
    System.out.println("executing request " + httppost.getRequestLine()); 
    HttpResponse response = httpclient.execute(httppost); 
    HttpEntity resEntity = response.getEntity(); 

    System.out.println(response.getStatusLine()); 
    if (resEntity != null) { 
     System.out.println(EntityUtils.toString(resEntity)); 
    } 
    if (resEntity != null) { 
     resEntity.consumeContent(); 
    } 

    httpclient.getConnectionManager().shutdown(); 
    } 
} 

Sử dụng HttpClient để tìm ra mã này. Nó luôn luôn tốt hơn để sử dụng thư viện ổn định khác hơn là xử lý từ đầu, trừ khi có cái gì đó để được xử lý theo cách tùy chỉnh.

+0

tôi đã có lỗi này: TÌNH TRẠNG LINE: HTTP/1.1 200 OK Stampo phản ứng il: ERROR: File không chuyển correctlyArray ( [usr_img] => Array ( [name] => FotoProfilo.png [ type] => image/jpeg [tmp_name] =>/tmp/phpp170qS [lỗi] => 0 [kích thước] => 5327 ) ) – Lele

+0

Ví dụ tuyệt vời! Cảm ơn bạn rất nhiều!!! – davs

+1

Lưu ý điều này để làm việc trong xây dựng bằng cách sử dụng một cái gì đó như maven bạn cần cả phụ thuộc httpclient và httpmime. –

3

Lớp Reader/Writer được thiết kế để xử lý dữ liệu văn bản, trong khi hình ảnh là nhị phân. Bạn cần phải diễn giải tệp của mình dưới dạng nhị phân:

FileChannel   in = new FileInputStream(fileToUpload).getChannel(); 
WritableByteChannel out = Channels.newChannel(connection.getOutputStream()); 

in.transferTo(0, fileToUpload.size(), out) 

Tất nhiên, bạn vẫn cần đóng mọi tài nguyên đã mở.

+0

Bạn có thể có nghĩa là WritableByteChannel, mà không cần thêm 'e'. java.nio.channels.WritableByteChannel –

+0

Chắc chắn, cảm ơn bạn đã lưu ý. Đã sửa. – ursa

+0

nếu loại 'fileToUpload' là' java.io.File', thì tại sao nó gây ra lỗi trên 'size()'. – JPG

2

Hãy thử rằng:

private DefaultHttpClient mHttpClient; 
Context context; 
public String error = ""; 

//Contrutor para que metodos possam ser usados fora de uma activity 
public HTTPconector(Context context) { 
    this.context = context; 
} 


public HTTPconector() { 
    HttpParams params = new BasicHttpParams(); 
    params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 
    mHttpClient = new DefaultHttpClient(params); 
} 


public void FileClientPost(String txtUrl, File file){ 
    try 
    { 
     error = ""; 
     HttpPost httppost = new HttpPost(txtUrl); 
     MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
     multipartEntity.addPart("Image", new FileBody(file)); 
     httppost.setEntity(multipartEntity); 
     mHttpClient.execute(httppost, new PhotoUploadResponseHandler()); 
    } 
    catch (Exception e) 
    { 
     Log.e(HTTPconector.class.getName(), e.getLocalizedMessage(), e); 
     e.getStackTrace(); 
     error = e.getMessage(); 
    } 
} 

//Verifica se a rede esta disponível 
public boolean isNetworkAvailable() { 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 
    // if no network is available networkInfo will be null 
    // otherwise check if we are connected 
    if (networkInfo != null && networkInfo.isConnected()) { 
     return true; 
    } 
    return false; 
} 

public String Get(String txtUrl){ 
    try { 
     URL url = new URL(txtUrl); 
     HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
     con.setReadTimeout(10000); 
     con.setConnectTimeout(15000); 
     con.setRequestMethod("GET"); 
     con.setDoInput(true); 
     con.connect(); 

     return readStream(con.getInputStream()); 

    } catch (ProtocolException e) { 
     e.printStackTrace(); 
     return "ERRO: "+e.getMessage(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return "ERRO: "+e.getMessage(); 
    } 
} 


public String Post(String txtUrl){ 
    File image; 

    try { 
     URL url = new URL(txtUrl); 
     HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
     con.setRequestMethod("POST"); 
     con.setDoInput(true); 
     con.setDoOutput(true); 
     con.connect(); 

     //con.getOutputStream().write(("name=" + "aa").getBytes()); 

     return readStream(con.getInputStream()); 
    } catch (ProtocolException e) { 
     e.printStackTrace(); 
     return "ERRO: "+e.getMessage(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return "ERRO: "+e.getMessage(); 
    } 
} 


//Usado para fazer conexão com a internet 
public String conectar(String u){ 
    String resultServer = ""; 
    try { 
     URL url = new URL(u); 
     HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
     resultServer = readStream(con.getInputStream()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     resultServer = "ERRO: "+ e.getMessage(); 
    } 

    Log.i("HTTPMANAGER: ", resultServer); 
    return resultServer; 
} 

//Lê o resultado da conexão 
private String readStream(InputStream in) { 
    String serverResult = ""; 
    BufferedReader reader = null; 
    try { 
     reader = new BufferedReader(new InputStreamReader(in)); 
     String line = ""; 
     while ((line = reader.readLine()) != null) { 
      System.out.println(line); 
     } 

     serverResult = reader.toString(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     serverResult = "ERRO: "+ e.getMessage(); 
    } finally { 
     if (reader != null) { 
      try { 
       reader.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
       serverResult = "ERRO: "+ e.getMessage(); 
      } 
     } 
    } 
    return serverResult; 
} 

private class PhotoUploadResponseHandler implements ResponseHandler<Object> 
{ 
    @Override 
    public Object handleResponse(HttpResponse response)throws ClientProtocolException, IOException { 

     HttpEntity r_entity = response.getEntity(); 
     String responseString = EntityUtils.toString(r_entity); 
     Log.d("UPLOAD", responseString); 
     return null; 
    } 
} 
Các vấn đề liên quan