java实现文件上传功能(下)

举报
泽宇-Li 发表于 2020/12/14 09:48:20 2020/12/14
【摘要】 public ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) { ServletFileUpload upload = new ServletFileUpload(factory); //监听文件上传进度 upload.setProgressListener(new ProgressListener() ...
public ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) {
 ServletFileUpload upload = new ServletFileUpload(factory);
 //监听文件上传进度
 upload.setProgressListener(new ProgressListener() {
  @Override
  public void update(long uploaded, long totalSize, int i) {
  System.out.println("已上传:"+(uploaded*100)/totalSize+"%");
  }
 });
 upload.setHeaderEncoding("UTF-8");//乱码处理
 upload.setFileSizeMax(1024 * 1024 * 10);//设置单个文件的最大值10M
 upload.setSizeMax(1024 * 1024 * 100);//设置总共能上传文件的最大值100M
 return upload;
 }
 
 public String uploadParseRequest(ServletFileUpload upload, HttpServletRequest req, String uploadPath) throws FileUploadException, IOException {
 String msg = "";
 //把前端请求解析,封装成一个List对象
 List<FileItem> fileItems = upload.parseRequest(req);
 for (FileItem fileItem : fileItems) {
  if (fileItem.isFormField()) {//判断上传的文件是普通的表单还是带文件的表单
  String name = fileItem.getName();//前端表单控件的name:username
  String value = fileItem.getString("UTF-8");//乱码处理
  System.out.println(name + ":" + value);
  } else {//判断为上传的文件
  //==================处理文件=====================
  String uploadFileName = fileItem.getName();//前端表单控件的name
  System.out.println("上传的文件名:" + uploadFileName);
  if (uploadFileName.trim().equals("") || uploadFileName == null) {//可能存在不合法的情况
   continue;
  }
  String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);//文件名
  String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);//文件后缀名
  System.out.println("文件名:" + fileName + "--文件后缀:" + fileExtName);
  //==================存放地址==================
  String uuidPath = UUID.randomUUID().toString();
  //文件存储的真实路径
  String realPath = uploadPath + "/" + uuidPath;
  System.out.println("文件上传到的位置:"+realPath);
  //给每个文件创建一个文件夹
  File realPathFile = new File(realPath);
  if (!realPathFile.exists()) {//如果文件夹不存在,则创建一个
   realPathFile.mkdir();
  }
  //==================文件传输==================
  //获得文件上传的流
  InputStream inputStream = fileItem.getInputStream();
  //创建一个文件输出流
  FileOutputStream fileOutputStream = new FileOutputStream(realPath + "/" + fileName);
  //创建一个缓冲区
  byte[] buffer = new byte[1024 * 1024];
  //判断读取是否完毕
  int len = 0;
  while ((len = inputStream.read(buffer)) > 0) {
   fileOutputStream.write(buffer, 0, len);
  }
  //关闭流
  fileOutputStream.close();
  inputStream.close();
  msg = "上传成功";
  fileItem.delete();//上传成功,清除临时文件
  }
 }
 return msg;
}

文件上传的注意事项

1、为保证服务器安全,上传的文件应该放在外界无法直接访问的目录下,例如放在WEB-INF目录下。
2、为了防止文件覆盖的现象,要为上传的文件产生一个唯一的文件名(可以为每一个上传的文件增加一个uuid或时间戳为名的文件夹)
3、限制上传文件的最大值
4、限制上传文件的类型,在收到上传文件时,判断其后缀名是否合法,是否为自己限制的类型






收藏点赞编辑
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。