文件上传注意事项



//设置响应头
  response.setContentType("application/force-download");   要注意协议头才能下载
  
  //给客户端传文件名
  //String aa = "aa.jpg";
  String aa = "湖南aa.jpg";
  aa = URLEncoder.encode(aa, "UTF-8");//文件名包含中文时,要编码
  response.setHeader("Content-Disposition", "attachment;filename=\""+aa+"\"");//必须要加“attachment;”,否则会变成浏览
  
  String fileName = request.getParameter("fileName");
  fileName = this.getServletContext().getRealPath(fileName); //把虚拟路径转换成绝对路径
  InputStream in = new FileInputStream(fileName);//绝对路径+文件名   类似:d:/a/imgs/1.jpg
  OutputStream out = response.getOutputStream();
  byte b[] = new byte[1024];
  int len=0;
  while((len=in.read(b))!=-1){
   out.write(b,0,len);
  }


文件上传时要设置一个临时文件夹

//声明上传文件时所用的临时文件目录
		File file = new File("d:/abc");
		DiskFileItemFactory f = new DiskFileItemFactory(1024*8, file); 

解析文件到上传的目录

//创建用于解析的对像
		ServletFileUpload upload = new ServletFileUpload(f);
		upload.setFileSizeMax(1024*1024*5);//设置每个文件最大为5M
		upload.setSizeMax(1024*1024*10);//所有上传文件大小之和的最大值,此处设最多通用上传10M
		
		String path = getServletContext().getRealPath("/upload");

如何解析文件,文件名后缀,扩展名

//真正的解析在下面
                  FileItem ff0=null;//要删除临时文件
		try {
			List<FileItem> list = upload.parseRequest(request);
			//System.out.println(list);
                        
			for(FileItem ff: list){
                                  ff0=ff;
				if(ff.isFormField()){//普通表单项信息---如本例中的desc项
					String desc = ff.getString("utf-8");
					System.out.println("文件说明表单项的内容:"+desc);
				}else{
					String name = ff.getName();
					String contentType = ff.getContentType();
					long size = ff.getSize();
					//System.out.println(name+","+contentType+","+size);
<p>                                         if(size==0){
                                        continue;
                                           }</p><p>                                   //防护:文件名为空
                                      if(name==null || name.trim().equals("")){
                                    continue;
                                     }
</p>
					//※服务器端的资源文件名不能用中文(因为浏览器请求时会自动编码)
					//必须把用户上传的文件名转换成没有中文的名字存储。同时,为了让用户在下载时能还原出原来的名字,就要把原文件名和映射名的对应关系存储起来,在用户下载时再转换回来
					//映射文件名
					String uuid = UUID.randomUUID().toString().replace("-", "");
					//原文件的扩展名
					String ext = name.substring(name.lastIndexOf("."));
					String fileName = uuid+ext;
					FileUtils.copyInputStreamToFile(ff.getInputStream(), new File(path+"/"+fileName));
				}
			  }
		   } catch (FileUploadException e) {
			e.printStackTrace();
	     }finally{
                  if(ff0!=null){
                      ff0.delelet();
                      }
                   }

文件上传中需要用到的类

ServletFileUpload();

 FileUtils.copyInputStreamToFile(ff.getInputStream(), new File(path+"/"+fileName));

String uuid=UUID.randomUUID().toString().replace("-", "");


防护2

if(size==0){
      continue;
     }

//防护:文件名为空
     if(name==null || name.trim().equals("")){
      continue;
     }

删除临时文件

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值