文件上传注意事项



//设置响应头
  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
    评论
Java 文件分片上传需要注意以下几点: 1. 文件切分大小:文件分片大小应该根据网络状况和服务器资源限制进行调整。如果分片过大,可能会导致上传过程中出现超时或者内存溢出等问题;如果分片过小,则会增加上传请求的数量,降低上传效率。 2. 分片顺序:上传分片时需要按照顺序进行上传,以确保服务器可以正确地合并所有分片。可以在上传前对分片按照文件顺序进行排序。 3. 分片重传:如果某个分片上传失败,为了确保上传成功,需要对失败的分片进行重传。可以设置一个最大重试次数,避免无限次重试。 4. 断点续传:如果上传过程中出现网络故障或者用户中断上传,可以考虑使用断点续传功能。断点续传可以记录上传的分片的位置和状态,以便在下次上传时从上次中断的位置继续上传。 5. 安全性:文件上传过程中需要确保数据的安全性,避免上传过程中数据被篡改或者泄露。可以使用 HTTPS 协议进行加密传输,或者对上传文件进行加密处理。 6. 并发性:为了提高上传效率,可以考虑使用多线程或者异步上传方式。但是需要注意并发上传的数量不能超过服务器的处理能力,否则可能会导致服务器负载过高或者网络拥塞。 总之,文件分片上传需要综合考虑上传效率、网络限制、服务器资源、安全性等多个方面,才能实现高效、稳定、安全的文件上传
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值