Estoy usando los siguientes valores de publicación de código usando JSoup:
Document document = Jsoup.connect("http://www......com/....php") .data("user","user","password","12345","email","info@tutorialswindow.com") .method(Method.POST) .execute() .parse();
Y ahora quiero enviar un archivo, también. Como un formulario con un campo de archivo. Es posible ? ¿Si es más que cómo?
Esto solo se admite desde Jsoup 1.8.2 (13 de abril de 2015) a través del nuevo método de 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", "info@tutorialswindow.com") .data("file", file.getName(), new FileInputStream(file)) .post(); // ...
En versiones anteriores, no se admite el envío multipart/form-data
solicitudes multipart/form-data
. Su mejor apuesta es usar un cliente HTTP de plena capacidad para esto, como Apache HttpComponents Client . En última instancia, puede obtener la respuesta del cliente HTTP como una String
modo que pueda alimentarla al 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("info@tutorialswindow.com")); 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); // ...
La respuesta aceptada funciona y fue correcta en el momento de la escritura, pero desde entonces JSoup ha evolucionado y desde la versión 1.8.2 es posible enviar archivos como parte de formularios de varias partes :
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","info@tutorialswindow.com") .data("file1", "filename", fs1) .method(Method.POST) .execute();
Esta publicación me llevó al camino correcto, pero tuve que modificar las respuestas publicadas para que mi caso de uso funcionara. 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 primero inicio sesión en el sitio, retengo la cookie de la respuesta ( conn
) y luego la uso para la posterior carga del archivo.
Espero que ayude chicos.