java struts2上传文件_java中Struts2 的文件上传和下载示例

表单准备

要想使用 HTML 表单上传一个或多个文件

须把 HTML 表单的 enctype 属性设置为 multipart/form-data

须把 HTML 表单的method 属性设置为 post

需添加 字段.

Struts 对文件上传的支持

在 Struts 应用程序里,FileUpload 拦截器和 Jakarta Commons FileUpload 组件可以完成文件的上传.

步骤:

在 Jsp 页面的文件上传表单里使用 file 标签. 如果需要一次上传多个文件,就必须使用多个 file 标签,但它们的名字必须是相同的

在 Action 中新添加 3 个和文件上传相关的属性. 这 3 个属性的名字必须是以下格式

基本的文件的上传: 直接在 Action 中定义如下 3 个属性,并提供对应的 getter 和 setter

[File Name] : 类型-File -被上传的文件。例如:data(fileName要求和文件表单项的name一致)

[File Name]ContentType : 类型-String -上传文件的文件类型。例如:dataContentType(用来接收文件类型(MIME值))

[File Name]FileName : String -上传文件的文件名。例如:dataFileName (用来接收文件的名字)

如果上传多个文件,可以使用 List

若传递多个文件,则上述的 3 个属性,可以改为 List 类型! 多个文件域的 name 属性值需要一致.

示例代码

public class UploadAction extends ActionSupport{

@Setter@Getter

private List photos;

@Setter@Getter

private List photosContentType;

@Setter@Getter

private List photosFileName;

@Setter@Getter

private List userName;

public String testUpload() throws IOException {

System.out.println("userName: "+userName);

System.out.println("photos: "+photos);

System.out.println("photosFileName: "+ photosFileName);

System.out.println("photosContentType: "+photosContentType);

// 将文件传到服务器根目录下upload文件下

// 获取ServletContext

ServletContext servletContext = ServletActionContext.getServletContext();

//获取真实路径

String realPath = servletContext.getRealPath("/upload");

System.out.println(realPath);

File uploadFile = new File(realPath);

//判断路径是否存在

if (!uploadFile.exists()){

//不存在创建

uploadFile.mkdir();

}

for (int i = 0; i < photos.size(); i++) {

UUID uuid = UUID.randomUUID();

FileUtils.copyFile(photos.get(i),new File(realPath + "/" + uuid + photosFileName.get(i)));

}

return SUCCESS;

}

}

1.处理几个小问题?

1.文件名重名,一般可以在文件名的前面生成一个UUID作为前缀。

2.限制单个文件的大小

3.限制文件的类型

4.限制总文件的大小

2.在Struts2 中提供了 FileUpload 拦截器 可以给我们设置这些属性值

FileUpload 拦截器有 3 个属性可以设置.

maximumSize: 上传单个文件的最大长度(以字节为单位),默认值为 2 MB

allowedTypes: 允许上传文件的类型,各类型之间以逗号分隔

allowedExtensions: 允许上传文件扩展名,各扩展名之间以逗号分隔

可以在 struts.xml 文件中覆盖这 3 个属性

注意:在 org.apache.struts2 下的 default.properties 中有对上传的文件总的大小的限制. 可以使用常量的方式来修改该限制struts.multipart.maxSize=2097152

57,408

image/pjpeg,image/gif

jpg,gif

/WEB-INF/views/success.jsp

/upload.jsp

一.上传文件相关的错误消息?

1.与文件上传有关的出错消息在 struts-messages.properties 文件里预定义.

2.可以在文件上传 Action 相对应的资源文件 或者 在 i18n_zh_CN.properties 国际化资源文件中重新定义错误消息

struts.messages.error.file.too.large=你传的文件太大了

struts.messages.error.content.type.not.allowed=文件类型错误

struts.messages.error.file.extension.not.allowed=扩展名错误

struts.messages.upload.error.SizeLimitExceededException=文件总大小超过上限

文件下载

在某些应用程序里,可能需要动态地把一个文件发送到用户的浏览器中,而这个文件的名字和存放位置在编程时是无法预知的

Stream 结果类型

Struts 专门为文件下载提供了一种 Stream 结果类型. 在使用一个 Stream 结果时,不必准备一个 JSP 页面.

Stream 结果类型可以设置如下参数:

contentType:被下载的文件的 MIME 类型。默认值为 text/plain

contentLength:被下载的文件的大小,以字节为单位

contentDisposition: 可以设置下载文件名的ContentDispositon 响应头,默认值为 inline,通常设置为如下格式:

attachment;filename="document.pdf".

inputName:Action 中提供的文件的输入流。默认值为 inputStream

bufferSize:文件下载时缓冲区的大小。默认值为 1024

allowCaching :文件下载时是否允许使用缓存。默认值为 true

contentCharSet:文件下载时的字符编码。

以上参数可以在 Action 中以 getter 方法的方式提供!

Stream 结果类型的参数可以在 Action 以属性的方式覆盖

具体使用细节参看 struts-2.3.15.3-all/struts-2.3.15.3/docs/WW/docs/stream-result.html

示例代码

下载

public class DownLoadAction extends ActionSupport{

//通常以下这几个参数会在Action 中提供

@Setter@Getter

private String contentType;

@Setter@Getter

private long contentLength;

@Setter@Getter

private String contentDisposition;

@Setter@Getter

private InputStream inputStream;

public String testDownLoad() throws FileNotFoundException,UnsupportedEncodingException {

//获取ServletContext

ServletContext servletContext = ServletActionContext.getServletContext();

//获取文件的路径

String realPath = servletContext.getRealPath("/WEB-INF/file/至少还有你.mp3");

//获取文件的流

inputStream = new FileInputStream(realPath);

//设置文件的类型

contentType = servletContext.getMimeType(realPath);

//获取文件的长度

contentLength = new File(realPath).length();

//设置文件名

String fileName = "至少还有你.mp3";

fileName = new String(fileName.getBytes("gbk"),"iso8859-1");

contentDisposition = "attachment;filename="+fileName;

return SUCCESS;

}

}

2048

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Struts2,可以通过以下步骤实现文件下载: 1. 在Action定义一个方法,用于处理文件下载请求。 2. 在方法,使用文件输入流将文件读取到内存。 3. 设置响应头信息,告诉浏览器下载文件。 4. 将文件内容写入响应输出流,完成文件下载。 下面是示例代码: ```java public class DownloadAction extends ActionSupport { private String fileName; // 文件名 private String filePath; // 文件路径 public String execute() throws Exception { File file = new File(filePath); if (!file.exists()) { return ERROR; // 文件不存在,返回错误页面 } HttpServletResponse response = ServletActionContext.getResponse(); response.reset(); // 清空响应头 response.setContentType("application/octet-stream"); // 设置响应类型为二进制流 response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(), "ISO8859-1")); // 设置响应头信息,告诉浏览器下载文件 FileInputStream fis = new FileInputStream(file); OutputStream os = response.getOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) > 0) { os.write(buffer, 0, len); } fis.close(); os.close(); return NONE; // 不需要跳转页面 } // getter和setter方法省略 } ``` 在JSP页面,可以通过以下代码触发文件下载: ```html <a href="${pageContext.request.contextPath}/download.action?fileName=${fileName}&filePath=${filePath}">下载文件</a> ``` 其,`fileName`和`filePath`是Action的属性,用于传递文件名和文件路径。`${pageContext.request.contextPath}`是应用的上下文路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值