2013-06-18 18 views
15

Sto tentando di inviare un'immagine a un sito Web utilizzando le richieste POST HTTP Java.Invia file immagine utilizzando le connessioni POST HTTP java

Sto utilizzando il codice di base qui utilizzato Upload files from Java client to a HTTP server:

Questa è la mia modifica:

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 

ricevo un codice di 200 risposta, alla fine, ma l'immagine è bacato, come in, colori casuali, che mi fanno pensare che sia un errore nella codifica dei caratteri. Ho provato a utilizzare UTF-8 come nell'esempio originale, ma ciò crea solo un'immagine corrotta.

Sono anche sicuro al 100% che non si tratta di un problema di server, perché posso utilizzare client di riposo come Advanced Rest Client/Postman e possono inviare un'immagine senza problemi.

Puoi aiutarmi a individuare cosa c'è che non va? Grazie.

+0

che si dovrebbe aggiungere il parametro 'Content-Transfer-Encoding: binary', dal momento che il caricamento deve essere maneggiato in forma binaria. –

+0

Forse il problema era perché stai usando BufferedReader.readLine() per ottenere l'immagine ?? Ovviamente si trova l'immagine "buggy" perché è necessario utilizzare solo InputStream.read (byte, 0, bytes.length) e quindi outputStream.write (byte) dove outputStream è connection.getOutputStream(); –

risposta

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

Utilizzare HttpClient per calcolare questo codice. È sempre meglio usare librerie stabili diverse dalla gestione da zero, a meno che non ci sia qualcosa da gestire in modo personalizzato.

+0

ho ottenuto questo errore: stato della linea: HTTP/1.1 200 OK Stampo Il risposta: ERRORE: File non mosso correctlyArray ( [usr_img] => Array ( [name] => FotoProfilo.png [ type] => image/jpeg [tmp_name] =>/tmp/phpp170qS [errore] => 0 [size] => 5327 ) ) – Lele

+0

grande esempio! Grazie mille!!! – davs

+1

Nota affinché funzioni in build usando qualcosa come maven, hai bisogno sia delle dipendenze httpclient che di httpmime. –

3

Le classi di lettura/scrittura sono progettate per gestire i dati di testo, mentre le immagini sono binarie. Hai bisogno di interpretare i file in formato binario:

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

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

Naturalmente, è ancora necessario chiudere tutte le risorse aperte.

+0

Probabilmente vuoi dire WritableByteChannel, senza l'extra 'e'. java.nio.channels.WritableByteChannel –

+0

Certo, grazie per la nota. Fisso. – ursa

+0

se il tipo di 'fileToUpload' è' java.io.File', allora perché sta causando un errore su 'size()'. – JPG

2

Prova che:

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