当前位置: 首页 > 面试题库 >

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

蒋鸿文
2023-03-14
问题内容

我必须将文件上传到服务器,该服务器仅使用文件上传按钮(通过http)公开jsf网页。我必须自动执行一个过程(作为Java独立过程完成),该过程生成一个文件并将该文件上传到服务器。可悲的是,必须将文件上传到的服务器不提供FTP或SFTP。有没有办法做到这一点?

谢谢,里奇


问题答案:

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

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

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

  • 使用表单在页面上发送GET请求。
  • 提取JSESSIONID cookie。
  • javax.faces.ViewState从响应中提取隐藏字段的值。如有必要(确保它具有动态生成的名称,从而可能更改每个请求),请提取输入文件字段的名称以及提交按钮。j_id前缀可识别动态生成的ID /名称。
  • 准备multipart/form-dataPOST请求。
  • 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);
// ...


 类似资料:
  • 在给定安全凭据(用户名、密码)和Windows远程桌面设置(rdp)的情况下,如何通过编程和Internet将文件从本地Java应用程序上载到Windows Server 2003远程桌面?

  • 问题内容: 我在4.4.2上,尝试通过uri删除文件(图像)。这是我的代码: 目前,这些删除功能均未真正删除文件。我的AndroidManifest.xml中也有此代码: 问题答案: 您为什么不使用以下代码对此进行测试: 我认为问题的一部分是您永远不要尝试删除文件,而只是创建一个具有方法调用的变量。 因此,在您的情况下,您可以尝试: 但是我认为这有点过分。 您添加了一条注释,说明您正在使用外部目录

  • 问题内容: 我想为Java的玩具语言编写一个编译器。我想生成可运行的.class文件。我想知道执行此操作的最佳库或工具是什么?我知道我可以学习所有指令的二进制格式并建立自己的常量池等,但这似乎应该已经完成​​:没必要重新发明轮子,对吗? 在线搜索我发现了两种不同的Java汇编语言Jasmin和Jamaica,但是只有Jasmin看起来有所维护。 是否存在用于将字节码写入流的Java库?这是Apac

  • AndroidR、 属性。selectableItemBackground存在,但如何通过编程将其添加到ImageButton? 此外,我如何在文档中找到答案?这里提到过,但我看不到任何关于它实际如何使用的解释。实际上,我似乎很少发现文档有用,但我希望这是我的错,而不是文档的错。

  • 问题内容: 如何以编程方式将(例如,按钮按下/ ACTION_PERFORMED)发送给? 我知道: 和 但是,是否可以直接发送给? 编辑:这不是生产代码,这只是一个小小的个人实验。 问题答案: 您可以获取按钮的,然后直接调用该方法。

  • 问题内容: 如何在不启动GUI的情况下如何编写python脚本来读取Tensorboard日志文件,提取损失和准确性以及其他数字数据? 问题答案: 您可以使用TensorBoard的Python类或脚本来提取数据: 如何从TensorBoard导出数据? 如果您想导出数据以在其他地方可视化(例如iPython Notebook),那也是可能的。您可以直接依赖TensorBoard用来加载数据的基础