struts2 文件的上传和下载

上传文件一直是我头疼的问题,那些流的问题很恼火,这几天终于有理出一点头绪,在这里记录一下,方便以后不记得了可以回忆回忆。

首先是我的action,我这个上传是要在添加文件的时候上传一个附件,所以这个action 有很多个方法,只是在struts.xml里面的配置不同返回的东西不一样而已。我这个上传的和添加数据是同一个方法里面的。当然你也可以写成两个方法。

方法:saveAttachments

//文件标题从jsp接受进行保存
 private String fileTitle;
 //文件路径
 private String fileUrl;
    // 上传文件域对象
    private File file;
    // 上传文件名
    private String fileFileName;
//第一步:获取发出请求的路径(tomcat编译后的文件目录)
		String uploadDir = ServletActionContext.getServletContext().getRealPath(Constants.FILE_SEP +"upload")+ Constants.FILE_SEP;
		File dirPath = new File(uploadDir);
        if (!dirPath.exists()) {//判断存放附件的文件夹upload是否存在
            dirPath.mkdirs(); //否则创建当前目录
        }
  //file1对象 是用来判断上传的文件是否存在(根据上传文件的文件名判断),避免重复上传覆盖了前面文件的内容。
        String address = dirPath.getAbsolutePath() + Constants.FILE_SEP + fileFileName;
        File file1 = new File(address);        //存进数据库的path
        fileUrl = "upload"+Constants.FILE_SEP+fileFileName;
        //为保存赋值
        attachment = new Attachments();
        if(fileTitle == null){
        	fileTitle= fileFileName;
        }
        attachment.setFileName(fileTitle);
        attachment.setUploadDate(new Date());
        attachment.setFilePath(fileUrl);
        
        
        //传
        //禁止上传包含中文的文件(不要这个判断可以上传中文的)
        String anotherString = null;
        try {
        anotherString = new String(fileFileName.getBytes("GBK"), "ISO8859_1");
        }
        catch (java.io.UnsupportedEncodingException ex) {
        }
        if(fileFileName.length()!=anotherString.length()){
        	saveMessage(getText("file.upload.string"));
        }else 
        //判断文件大小是否是0字节(不做这个判断会报找不到文件的错误)
    	if(file.length()==0){
			saveMessage(getText("file.upload.min"));
    	}else
    	//读取流上传
    	if(attachmentsManager.checkFile(address) && !file1.exists()){
    		Attachments att = attachmentsManager.save(attachment);
			if(att!=null && file!=null){
				InputStream stream; //输入
				OutputStream bos;	//输出
				try {
				
					stream =  new FileInputStream(file);
					bos = new FileOutputStream(uploadDir + fileFileName);
				        int bytesRead;
				        byte[] buffer = new byte[1024];
				        while ((bytesRead = stream.read(buffer, 0, 1024)) != -1) {
				            bos.write(buffer, 0, bytesRead);
				        }
				        bos.close();
				        stream.close();				        
				} catch (Exception e) {
					e.printStackTrace();
				}    			 
				saveMessage(getText("file.upload.success"));				
			}else{
				saveMessage(getText("file.upload.fail"));
			}
    	}else{
			saveMessage(getText("file.upload.exist"));
		}    	
		return showUpload(); //我这里返回的我是显示数据列表的方法,可以根据自己的情况在struts.xml里面配置
	}

下面是我所遇到的问题:

 

问题一:

          由于我这里的下载是同超链接下载的,不能下载带中的文件,所以在上传的时候做了判断,不能上传中文的。

 

问题二:

          严重: Servlet.service() for servlet default threw exception
java.io.FileNotFoundException: F:\apache-tomcat-6.0.18\work\Catalina\localhost\Struts2FileUpload\upload_7eaf9265_121967f32c7__7ff5_00000001.tmp (系统找不到指定的文件。)

        这种错误一般有两个原因:

    原因一:就是action取名的时候变量名没有注意,Struts2上传文件是接收到前台的参数进行后台给变量赋值时,变量的名称的定义不是随便的,struts2有一种自动的机制,(具体的我也不是很清楚,只是知道名字取对了他会自动为你保存的)能够将文件名,文件类型自动保存到一个变量里面(File 对象的变量+你的变量名)。

    原因二:就是上传了文件为0字节的文件,在上传前之前判断一下就可以了。

 

 

我的下载方法:

     我用的是超链接下载(网上看了好多,这个比较简单,可不好的就是不能下载中文名称的文件):

String path = request.getContextPath();   
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

 

这样可以获取到当前你服务器的地址了比如:(http://localhost:8080/......)

<a href ="前面获取路径的那个变量+数据库里面存的文件名" target="_blank">&nbsp;下&nbsp;&nbsp;载&nbsp;</a>

 

用文件流下载的方式:

用这种方法的一个好处是可以下载中文文件,

 

下面是我的java代码:

 

public String downFile(){
		
		//获取前台传过来的id。
		String id = getRequest().getParameter("id");
		//根据传过来的id找到对应的文件名称。
		Attachments att = attachmentsManager.get(Long.valueOf(id));
		
		HttpServletResponse resp = ServletActionContext.getResponse();
		String path = ServletActionContext.getServletContext().getRealPath(Constants.FILE_SEP);
		String filename = Constants.FILE_SEP +att.getFilePath(); // 生成文件的文件名称 这个需要动态的获取
		OutputStream out;// 输出响应正文的输出流
		InputStream in;// 读取本地文件的输入流
		// 获得本地输入流
		File file = new File(path + filename);
		try {
			in = new FileInputStream(file);
			// 设置响应正文的MIME类型
			resp.setContentType("Content-Disposition;charset=GB2312");
			resp.setHeader("Content-Disposition", "attachment;" + " filename="
					+ new String(filename.getBytes(), "ISO-8859-1"));
			// 把本地文件发送给客户端
			out = resp.getOutputStream();
			int byteRead = 0;
			byte[] buffer = new byte[512];
			while ((byteRead = in.read(buffer)) != -1) {
				out.write(buffer, 0, byteRead);
			}
			in.close();
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

 

在jsp页面调用这个方法即可,别忘了得把id传到方法里面。

 

 设置上传文件大小。在struts.xml里面

<constant name="struts.multipart.maxSize" value="10000000" />”  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值