如何以编程方式将文件上传到网站?

如何以编程方式将文件上传到网站?,第1张

如何以编程方式将文件上传到网站?

以编程方式提交JSF生成的表单时,需要确保考虑以下三点:

  1. 维护HTTP会话(肯定是网站是否启用了JSF服务器端状态保存功能)。
  2. 发送
    javax.faces.ViewState
    隐藏字段名称/值对。
  3. 发送实际上要按下的按钮的名称/值对。

否则,可能根本不会调用该动作。对于剩余部分,它与“常规”形式没有什么不同。流程基本上如下:

  • 使用表单在页面上发送GET请求。
  • 提取JSESSIonID cookie。
  • javax.faces.ViewState
    从响应中提取隐藏字段的值。如有必要(确保它具有动态生成的名称,从而可能更改每个请求),请提取输入文件字段的名称以及提交按钮。
    j_id
    前缀可识别动态生成的ID /名称。
  • 准备
    multipart/form-data
    POST请求。
  • null
    根据该请求设置JSESSIonID cookie(如果不是)。
  • 设置
    javax.faces.ViewState
    隐藏字段和按钮的名称/值对。
  • 设置要上传的文件。

您可以使用任何HTTP客户端库来执行任务。

java.net.URLConnection
为此,标准的Java SE
API提供了相当低的水平。为了减少冗长的代码,您可以使用Apache
HttpClient
发出HTTP请求并管理cookie,并使用Jsoup从HTML中提取数据。

这是一个启动示例,假设页面只有一个

<form>
(否则,您需要在Jsoup的CSS选择器中包括该表单的唯一标识符):

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);// ...


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5091049.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存