Java模拟表单提交文件到Struts2 Action处理

1 下载量 72 浏览量 更新于2024-08-28 收藏 54KB PDF 举报
该资源主要讲述了如何在Java中模拟表单方式发送URL请求来提交文件,并且描述了后台Struts2的Action如何接收并处理这些请求。内容涉及到Java的网络编程,文件操作,以及Struts2框架的使用。 在Java中发送URL请求进行文件提交,通常我们会使用`HttpURLConnection`类来实现。以下是一段示例代码: ```java private static void testSimulateFormToPostFile() { String localPath = "F:\软件开发经验\DeleteNullDir.java"; File file = new File(localPath); // 本地文件 URL url = new URL("http://10.49.61.101:9999/finance/ajaxUploadFile.do"); // 服务器action地址 StringBuilder sb_cookie = null; // 拼装cookies StringBuilder sb_body = null; // 报文体 HttpURLConnection httpUrl = null; // http协议类 OutputStream fos = null; // 文件流 FileInputStream fis = null; // 服务器回写响应流 try { if (!file.exists()) { throw new Exception(); } // 初始化HTTP连接 httpUrl = (HttpURLConnection) url.openConnection(); httpUrl.setDoOutput(true); // 设置允许输出 httpUrl.setRequestMethod("POST"); // 设置请求方法为POST httpUrl.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + "—————————7da2e53660"); // 创建输出流,准备写入文件数据 fos = httpUrl.getOutputStream(); // 构造请求体,包含文件内容 sb_body = new StringBuilder(); sb_body.append("--").append("—————————7da2e53660").append("\r\n"); sb_body.append("Content-Disposition: form-data; name=\"file\"; filename=\"").append(file.getName()).append("\"\r\n"); sb_body.append("Content-Type: application/octet-stream\r\n\r\n"); fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int length; while ((length = fis.read(buffer)) != -1) { fos.write(buffer, 0, length); } fis.close(); // 添加文件结束标识 sb_body.append("\r\n").append("--").append("—————————7da2e53660").append("--\r\n"); // 将请求体写入输出流 fos.write(sb_body.toString().getBytes()); // 发送请求 fos.flush(); // 处理响应 int responseCode = httpUrl.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { // 读取响应 BufferedReader br = new BufferedReader(new InputStreamReader(httpUrl.getInputStream())); String line; while ((line = br.readLine()) != null) { System.out.println(line); } br.close(); } else { System.out.println("请求失败,状态码:" + responseCode); } } catch (Exception e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException ignored) {} } if (httpUrl != null) { httpUrl.disconnect(); } } } ``` 这段代码首先创建了一个`File`对象表示要上传的本地文件,然后通过`URL`对象指定服务器接收文件的action地址。使用`HttpURLConnection`建立与服务器的连接,并设置为POST请求。为了上传文件,需要设置请求头的`Content-Type`为`multipart/form-data`,并指定分隔符用于区分不同部分的数据。 在构造请求体时,首先添加文件的边界标识,然后是文件内容的描述(包括文件名和类型),接着将文件内容写入输出流。最后,添加一个文件结束的边界标识。这样就构建了一个完整的POST请求体。 发送请求后,通过`getResponseCode()`检查服务器的响应状态,如果是HTTP_OK(200),则读取服务器返回的响应内容。如果出现异常或请求失败,会打印相应的错误信息。 在Struts2框架中,Action类会接收到这个POST请求。为了接收文件,Action类需要有一个对应字段,通常使用`@RequestParam`注解来指定。例如: ```java public class UploadFileAction extends ActionSupport { private File file; private String fileName; @Override public String execute() throws Exception { // 在这里处理文件,例如保存到服务器 // ... return SUCCESS; } // getter和setter方法 public File getFile() { return file; } public void setFile(File file) { this.file = file; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } } ``` 在这个例子中,`file`字段将接收到上传的文件,`fileName`字段则保存文件名。在`execute()`方法内,你可以对文件进行处理,比如保存到服务器的某个目录下。 总结来说,Java中的文件上传通常涉及网络编程知识,如HTTP协议、流操作,以及Struts2等Web框架的使用。理解这些概念和技术对于开发支持文件上传功能的Web应用至关重要。