文件上传功能实现(二)

时间:2022-03-26 12:23:06

IE低版本的文件名称Bug解决

    问题:使用fileItem.getName()这个方法的时候,可以拿到文件名称,一般浏览器拿到的格式:xx.png

      但IE拿到的是D:/xx/xx/xx.png   我们的功能就实现不了

    解决方案:使用导入的IO包中的 

FilenameUtils 工具类中的getName()方法  可以拿到 xx.png

于是:咱们把拿到名称的代码进行修改即可

修改前(IE低版本中有问题)

String fileName =fileItem.getName();

修改后(解决了IE低版本中拿文件名称的问题)

String fileName = FilenameUtils.getName(fileItem.getName());

         

②上传的文件的名称冲突问题

   问题:如果存在了同名的文件就会上传失败或者替换原来的文件

   解决方案:把上传的文件名称改成一个随机的数计可(注:后缀不可变)

代码分析:

//拿到文件的名称

String fileName = FilenameUtils.getName(fileItem.getName());

//拿到文件的后缀

String extName = FilenameUtils.getExtension(fileName);

//生成随机的名称,可以是一个时间字符串

  Date date=new Date();  String upname=String.valueOf(date);

String fileUUIDName = UUID.randomUUID().toString();

//结合成我们的随机名称(带后缀)

String randomFileName = fileUUIDName+"."+extName;

//最后文件上传的位置

File uploadFile = new File("D:/",randomFileName);

注意:在拼接文件名的时候一定不要忘记"."
    

 ③解决文件保存位置的问题

    问题:现在我的文件保存的路径是磁盘,有的操作系统是没有盘符的那该怎么办呢?

    解决方案:直接把文件保存到我们的项目就可以了

    //拿到当前项目的根目录路径(实际路径)通过上下文对象去拿

    super.getServletContext().getRealPath("/");括号里面可以写我们文件想保存的路径

但是你的项目下面必须有这个文件夹(我是创建了一个upload文件夹)

代码:拿到本项目中的路径

//最后文件上传的位置

String realPath = super.getServletContext().getRealPath("/upload");

File uploadFile = new File(realPath,randomFileName);

如果路径设置有问题会抛出文件路径找不到的异常:检查你的项目下是否有这个路径存在

代码:

@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {    
        //创建一个工厂解析这个请求,得到的是一个集合,这个集合装的就是一个请求对象,封装的就是每一条请求数据
        try {
            // 创建一个工厂
            FileItemFactory factory = new DiskFileItemFactory();
            
            // 创建一个文件上传的处理器
            ServletFileUpload upload = new ServletFileUpload(factory);
            
            //解析这个请求:解析完之后咱们可以拿到一个FileItem的集合
            List < FileItem > items = upload.parseRequest(req);
            
            //通过遍历集合可以拿到上传的文件的属性值,包括属性名,值..
            for (FileItem fileItem : items) {                
                //上面的测试可以看输出,普通控件和file控件的处理方式是要区别对待的
                if(fileItem.isFormField()){
                    //代表是一般表单,用一般表单的处理方式解决即可
                    //String username = req.getParameter("username");
                    //String password = req.getParameter("password");
                    
                }else{
                    //拿到上传文件的名称(有ie版本问题)
                    //String upname=fileItem.getName();
                    //解决方案
                    //String upname = FilenameUtils.getName(fileItem.getName());        
                    
                    
                    //解决重名文件上传的问题
                    //①获得上传文件的名称
                    String upname = FilenameUtils.getName(fileItem.getName());
                    //②获得上传文件的后缀名(使用FilenameUtils工具类)
                    String extName = FilenameUtils.getExtension(upname);
                    //③生成一个随机的名称 提供了两种方式
                    String fileUUIDName = UUID.randomUUID().toString();


                   // Date date=new Date();

      //  String str=String.valueOf(date);


                    //拼接成一个新的文件名称,作为文件上传后的保存名称
                    String upFileName=fileUUIDName+"."+extName;
                    
                    //解决保存路路径的问题
                    //①拿到上传文件在项目中保存的路径
                    String realPath = super.getServletContext().getRealPath("/upload");
                    System.out.println(realPath);
                    //确定文件上传的位置
                    File uploadFile = new File(realPath,upFileName);
                                        
                    //将本地的文件写到服务器中
                    fileItem.write(uploadFile);
                }                
            }            
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }        
    }
}

我也是一个初学者,只是把我的一些理解放在上面,还有很多的不足,请多多给些建议!