¿Cómo puedo subir un archivo mediante progtwigción a un sitio web?

Tengo que subir un archivo a un servidor que solo expone una página web jsf con el botón de carga de archivos (a través de http). Tengo que automatizar un proceso (hecho como un proceso independiente de java) que genera un archivo y carga el archivo al servidor. Demasiado el servidor al que se debe cargar el archivo no proporciona un FTP o SFTP. ¿Hay alguna forma de hacer esto?

Gracias, Richie

Al enviar un formulario JSF generado programáticamente, debe asegurarse de tener en cuenta las siguientes 3 cosas:

  1. Mantenga la sesión HTTP (sin duda, si el sitio web tiene activada la función de ahorro de estado del servidor JSF).
  2. Envíe el par nombre-valor del campo oculto javax.faces.ViewState .
  3. Envíe el par nombre-valor del botón que se va a presionar virtualmente.

De lo contrario, la acción posiblemente no se invocará en absoluto. Para el remanente no es diferente de las formas “regulares”. El flujo es básicamente de la siguiente manera:

  • Envíe una solicitud GET en la página con el formulario.
  • Extraiga la cookie JSESSIONID.
  • Extraiga el valor del campo oculto javax.faces.ViewState de la respuesta. Si es necesario (para asegurarse de que tenga un nombre generado dinámicamente y, por lo tanto, posiblemente cambie cada solicitud), extraiga el nombre del campo del archivo de entrada y el botón de enviar también. Los ID / nombres generados dinámicamente son reconocibles por el prefijo j_id .
  • Prepare una solicitud POST multipart/form-data .
  • Establezca la cookie JSESSIONID (si no es null ) en esa solicitud.
  • Establezca el par de nombre-valor del campo oculto javax.faces.ViewState y el botón.
  • Establezca el archivo que se cargará.

Puede usar cualquier biblioteca de cliente HTTP para realizar la tarea. La API Java SE estándar ofrece java.net.URLConnection para esto, que es bastante bajo nivel . Para terminar con un código menos detallado, podría usar Apache HttpClient para hacer las solicitudes HTTP y administrar las cookies y Jsoup para extraer datos del HTML.

Este es un ejemplo inicial, suponiendo que la página tiene solo un

(de lo contrario, debe incluir un identificador único de ese formulario en los selectores CSS de Jsoup):

 String url = "http://localhost:8088/playground/test.xhtml"; String viewStateName = "javax.faces.ViewState"; String submitButtonValue = "Upload"; // Value of upload submit button. HttpClient httpClient = new DefaultHttpClient(); HttpContext httpContext = new BasicHttpContext(); httpContext.setAttribute(ClientContext.COOKIE_STORE, new BasicCookieStore()); HttpGet httpGet = new HttpGet(url); HttpResponse getResponse = httpClient.execute(httpGet, httpContext); Document document = Jsoup.parse(EntityUtils.toString(getResponse.getEntity())); String viewStateValue = document.select("input[type=hidden][name=" + viewStateName + "]").val(); String uploadFieldName = document.select("input[type=file]").attr("name"); String submitButtonName = document.select("input[type=submit][value=" + submitButtonValue + "]").attr("name"); File file = new File("/path/to/file/you/want/to/upload.ext"); InputStream fileContent = new FileInputStream(file); String fileContentType = "application/octet-stream"; // Or whatever specific. String fileName = file.getName(); HttpPost httpPost = new HttpPost(url); MultipartEntity entity = new MultipartEntity(); entity.addPart(uploadFieldName, new InputStreamBody(fileContent, fileContentType, fileName)); entity.addPart(viewStateName, new StringBody(viewStateValue)); entity.addPart(submitButtonName, new StringBody(submitButtonValue)); httpPost.setEntity(entity); HttpResponse postResponse = httpClient.execute(httpPost, httpContext); // ... 

Intente utilizar HttpClient, aquí hay un artículo que creo que describe lo que quiere, en la parte inferior hay una sección titulada “Uso de HttpClient-Based FileUpload”.

Espero que esto ayude.

Probablemente esa página web solo envíe una solicitud POST al servidor con el contenido del formulario. Puede enviar fácilmente una solicitud POST así desde Java, sin usar esa página. Por ejemplo, este artículo muestra un ejemplo de envío de solicitudes POST desde Java

Lo que tendrá que hacer es examinar el código HTML en la página y determinar qué parámetros se necesitan para publicar el formulario. Probablemente se verá algo como esto:

 

Basado en eso, puede escribir un código para hacer una solicitud POST a la url:

 String data = URLEncoder.encode("value1", "UTF-8") + "=" + URLEncoder.encode("value1", "UTF-8"); data += "&" + URLEncoder.encode("file1", "UTF-8") + "=" + URLEncoder.encode(FileData, "UTF-8"); // Send data URL url = new URL("http://servername.com/RequestURL"); URLConnection conn = url.openConnection(); conn.setDoOutput(true); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write(data); wr.flush(); wr.close(); 

Recuerde que la persona que escribió la página podría hacer algunas comprobaciones para asegurarse de que la solicitud POST provenga del mismo sitio. En ese caso, es posible que tenga problemas y deba configurar el agente de usuario correctamente.

Podría intentar usar HtmlUnit para esto. Proporciona una API muy simple para simular acciones del navegador. Ya usé este enfoque para requisitos similares. Es muy fácil. Usted debe darle una oportunidad.