【Struts2】4.文件上传与下载

进行文件上传时,必须将表单的method属性设为post,将enctype属性设为multipart/form-data。 Struts2在进行文件上传操作时,实际上是通过两个步骤实现的: 1) 首先将客户端上传的文件保存到struts.multipart.saveDir键所指定的目录中,如果该键所对应的目录不存在,那么就保存到javax.servlet.context.tempdir环境变量所指定的目录中。 2) Action中所定义的File类型的成员变量file实际上指向的是临时目录中的临时文件,然后在服务器端通过IO的方式将临时文件写入到指定的服务器端目录中。

Servlet实现
 通过FileUploadInterceptor拦截器实现
public class UploadServlet extends HttpServlet{
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException{
        //磁盘文件工厂

		DiskFileItemFactory factory = new DiskFileItemFactory();
		//文件保存路径
		String path = req.getRealPath("/upload");
		
        //设置属性,目录,用于临时存储的文件目录

		factory.setRepository(new File(path));
        //设置存储磁盘的最小值,超出该值直接存在磁盘,小于在内存中

		factory.setSizeThreshold(1024 * 1024);
		
        //新建一个文件上传

		ServletFileUpload upload = new ServletFileUpload(factory);
		
		try{
            //获取到页面传递的列表
			List<FileItem> list = (List<FileItem>)upload.parseRequest(req);
			
			for(FileItem item : list){
				String name = item.getFieldName();
				//判断该项是文本单元还是文件域,若为文本单元
				if(item.isFormField()){
					String value = item.getString();
					
					System.out.println(name + "=" + value);
					
					req.setAttribute(name, value);
				}
				else//为文件
				{//获取文件名称(不同浏览器不同,有些包含路径)
					String value = item.getName();
					
					int start = value.lastIndexOf("\\");
					String fileName = value.substring(start + 1);
					
					req.setAttribute(name, fileName);
					//该行等价于下面的实现
					item.write(new File(path, fileName));
//					
//					OutputStream os = new FileOutputStream(new File(path, fileName));
//					
//					InputStream is = item.getInputStream();
//					
//					byte[] buffer = new byte[400];
//					
//					int length = 0;
//					
//					while((length = is.read(buffer)) != -1)
//					{
//						os.write(buffer, 0, length);
//					}
//					
//					is.close();
//					os.close();
				}
			}
			
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
		
		req.getRequestDispatcher("fileUploadResult.jsp").forward(req, resp);
	}
}
struts2实现方式 
public class UploadAction extends ActionSupport{
	private String username;

	private File file;

	private String fileFileName;

	private String fileContentType;

	public String getUsername(){
		return username;
	}
	public void setUsername(String username){
		this.username = username;
	}
	public File getFile(){
		return file;
	}
	public void setFile(File file){
		this.file = file;
	}
	public String getFileFileName(){
		return fileFileName;
	}
	public void setFileFileName(String fileFileName){
		this.fileFileName = fileFileName;
	}
	public String getFileContentType(){
		return fileContentType;
	}
	public void setFileContentType(String fileContentType){
		this.fileContentType = fileContentType;
	}
	@Override
	public String execute() throws Exception{
		String root = ServletActionContext.getRequest().getRealPath("/upload");
		
		InputStream is = n ew FileInputStream(file);
		
		System.out.println("path: " + file.getAbsolutePath());
		
		System.out.println("file: " + file.getName());
		
		System.out.println("fileFileName: " + fileFileName);
		
		File destFile = new File(root, fileFileName);
		
		OutputStream os = new FileOutputStream(destFile);
		
		byte[] buffer = new byte[400];
		
		int length = 0;
		
		while(-1 != (length = is.read(buffer))){
			os.write(buffer, 0, length);
			
			Thread.sleep(1000);
		}
		is.close();
		os.close();
		
		return SUCCESS;
	}
}

下载
方式一:
public class DownloadAction extends ActionSupport{
	public InputStream getDownloadFile(){
		return ServletActionContext.getServletContext().getResourceAsStream(
				"/upload/comments.txt");
	}
	@Override
	public String execute() throws Exception{
		return SUCCESS;
	}
}
对应的struts.xml配置
<action name="downloadFile" class="com.shengsiyuan.struts2.DownloadAction">
	<result type="stream">
		<param name="contentDisposition">attachment;filename="文件名"</param>
		<param name="inputName">downloadFile</param>
	</result>
</action>

方式二:
public class DownloadAction2 extends ActionSupport{
	private int number;

	private String filename;

	public String getFilename(){
		return filename;
	}
	public void setFilename(String filename){
		this.filename = filename;
	}
	public int getNumber(){
		return number;
	}
	public void setNumber(int number){
		this.number = number;
	}
	public InputStream getDownloadFile(){
		try{
			if (1 == number){
				this.filename = "中文圣思园文件下载.txt";
				//若为中文,会出现乱码的问题
                this.filename = new String(this.filename.getBytes("gbk"),
						"8859_1");
				return ServletActionContext.getServletContext()
						.getResourceAsStream("/upload/中文圣思园文件下载.txt");
			}else{
				this.filename = "CaptureSprite.exe";

				return ServletActionContext.getServletContext()
						.getResourceAsStream("/upload/CaptureSprite.exe");
			}
		}catch (Exception ex){

		}
		return null;
	}
	@Override
	public String execute() throws Exception{
		return SUCCESS;
	}
}
对应的配置
<action name="downloadFile2" class="com.shengsiyuan.struts2.DownloadAction2">
	<result type="stream">
		<param name="contentDisposition">attachment;filename=${filename}</param>
		<param name="inputName">downloadFile</param>
	</result>
</action>



注:此文档为学习圣思园风中叶教程结合自身学习所记录。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值