2011-09-10 34 views
12

yo estoy usando los siguientes valores Código postal utilizando JSoup:¿Cómo publicar archivos usando JSoup?

Document document = Jsoup.connect("http://www......com/....php") 
        .data("user","user","password","12345","email","[email protected]") 
        .method(Method.POST) 
        .execute() 
        .parse(); 

Y ahora quiero enviar un archivo, también. Como un formulario con un campo de archivo. ¿Esto es posible? ¿Si es más que cómo?

Respuesta

14

Esto solo se admite desde Jsoup 1.8.2 (13 de abril de 2015) mediante el nuevo método data(String, String, InputStream).

String url = "http://www......com/....php"; 
File file = new File("/path/to/file.ext"); 

Document document = Jsoup.connect(url) 
    .data("user", "user") 
    .data("password", "12345") 
    .data("email", "[email protected]") 
    .data("file", file.getName(), new FileInputStream(file)) 
    .post(); 
// ... 

En versiones anteriores, el envío de solicitudes multipart/form-data no es compatible. Su mejor opción es utilizar un cliente HTTP completo para esto, como Apache HttpComponents Client. En última instancia, puede obtener la respuesta del cliente HTTP como String para que pueda alimentarlo al método Jsoup#parse().

String url = "http://www......com/....php"; 
File file = new File("/path/to/file.ext"); 

MultipartEntity entity = new MultipartEntity(); 
entity.addPart("user", new StringBody("user")); 
entity.addPart("password", new StringBody("12345")); 
entity.addPart("email", new StringBody("[email protected]")); 
entity.addPart("file", new InputStreamBody(new FileInputStream(file), file.getName())); 

HttpPost post = new HttpPost(url); 
post.setEntity(entity); 

HttpClient client = new DefaultHttpClient(); 
HttpResponse response = client.execute(post); 
String html = EntityUtils.toString(response.getEntity()); 

Document document = Jsoup.parse(html, url); 
// ... 
4

Las obras respuesta aceptada y era correcta en el momento de la escritura, pero desde entonces JSoup ha evolucionado y since version 1.8.2 it is possible to send files as part of multipart forms:

File file1 = new File("/path/to/file"); 
FileInputStream fs1 = new FileInputStream(file1); 

Connection.Response response = Jsoup.connect("http://www......com/....php") 
    .data("user","user","password","12345","email","[email protected]")    
    .data("file1", "filename", fs1) 
    .method(Method.POST) 
    .execute(); 
0

Este post me llevó por el camino correcto, pero tuve que retocar el respuestas publicadas para hacer que mi caso de uso funcione. Aquí está mi código:

 FileInputStream fs = new FileInputStream(fileToSend); 
     Connection conn = Jsoup.connect(baseUrl + authUrl) 
       .data("username",username) 
       .data("password",password); 
     Document document = conn.post(); 

     System.out.println("Login successfully! Session Cookie: " + conn.response().cookies()); 


     System.out.println("Attempting to upload file..."); 
     document = Jsoup.connect(baseUrl + uploadUrl) 
       .data("file",fileToSend.getName(),fs) 
       .cookies(conn.response().cookies()) 
       .post(); 

La diferencia básica es que por primera vez acceder al sitio, conservo la cookie de la respuesta (conn) y luego lo uso para la carga posterior del archivo.

Espero que ayude chicos.