文件上传功能实现(二)

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();
        }        
    }
}

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

时间: 2024-10-26 22:04:30

文件上传功能实现(二)的相关文章

达到HTTP合约Get、Post和文件上传功能——采用WinHttp介面

于<采用WinHttp实现HTTP协议Get.Post和文件上传功能>一文中,我已经比較具体地解说了怎样使用WinHttp接口实现各种协议. 在近期的代码梳理中,我认为Post和文件上传模块能够得到简化,于是差点儿重写了这两个功能的代码.由于Get.Post和文件上传功能的基础(父)类基本没有修改,函数调用的流程也基本没有变化,所以本文我将重点解说修改点. (转载请指明出于breaksoftware的csdn博客) 首先我改动了接口的字符集.之前我都是使用UNICODE作为接口參数类型,当中一

实现HTTP协议Get、Post和文件上传功能——使用libcurl接口实现

之前我们已经详细介绍了WinHttp接口如何实现Http的相关功能.本文我将主要讲解如何使用libcurl库去实现相关功能.(转载请指明出于breaksoftware的csdn博客) libcurl在http://curl.haxx.se/libcurl/有详细的介绍,有兴趣的朋友可以去读下.本文我只是从实际使用的角度讲解其中的一些功能. libcurl中主要有两个接口类型:CURL和CURLM.CURL又称easy interface,它接口简单.使用方便,但是它是一个同步接口,我们不能使用它

实现HTTP协议Get、Post和文件上传功能——使用WinHttp接口实现

在<使用WinHttp接口实现HTTP协议Get.Post和文件上传功能>一文中,我已经比较详细地讲解了如何使用WinHttp接口实现各种协议.在最近的代码梳理中,我觉得Post和文件上传模块可以得到简化,于是几乎重写了这两个功能的代码.因为Get.Post和文件上传功能的基础(父)类基本没有改动,函数调用的流程也基本没有变化,所以本文我将重点讲解修改点.(转载请指明出于breaksoftware的csdn博客) 首先我修改了接口的字符集.之前我都是使用UNICODE作为接口参数类型,其中一个

文件上传功能的实现

一:文件上传功能 先要在在index.jsp的界面上初始化一个表单. 代码如下: <body> <form enctype="multipart/form-data" action="<%=path%>/1.jsp" method="post"> 姓名:<input type="text" name="username"/> 选择文件:<input ty

AEAI Miscdp文件上传功能使用心得

1.概述 在实际项目中,我们常常可以遇到这样的情况:上传头像.上传图片.上传视频.上传音乐.上传作业,等等-那么如何使用MiscdpStudio对这类功能进行开发,就成了MiscdpStudio使用者必须掌握的技能之一. 接下来,我就对单表操作模型,简单介绍一下如何对文件进行上传.这里,我们主要使用的是fileupload组件,当然,这也是开发平台中自带的组件. 2.创建数据表 在这里,我们需要在数据库创建两个表,一个是业务表.另一个是关联表.关联表里有三个字段:逻辑主键.业务标识字段.附件标识

iOS 的 Safari 文件上传功能详解

iOS 6 给 Safari 浏览器带来的另外一个功能是文件上传,终于 Safari 终于支持 input 输入框的文件类型了,并且还支持 HTML媒体捕获(HTML Media Capture). 上传单张图片或者视频 <input type="file"> 可以选择直接拍照或者摄影,也可以从相册中选取.选好之后,iOS 上的 Safari 和其他浏览器不同是它显示图片的截图,而不是图片的临时名称. 上传多张图片或者视频 如果你想一次上传多张图片,可以使用 HTML5 一

Spring MVC 文件上传功能详解

前言 在Spring MVC中实现文件上传功能并不复杂,前端使用HTML语法,后端使用特定抽象.参考Spring Boot相关文档即可.本文主要讲解常见资料忽略的两个问题: 文件上传错误 链接重置问题 版本:Spring Boot 1.5x 文件上传错误 一个关注点是如何处理文件上传期间发生的错误,错误主要分为两类: IOException 文件读取或写入错误. MultipartException 上传文件时,超过文件大小上限所触发的异常. IOException 只需要在Controller

文件/大文件上传功能实现(JS+PHP)全过程

文件/大文件上传功能实现(JS+PHP) 参考博文:掘金-橙红年代 前端大文件上传 路漫漫 其修远 PHP + JS 实现大文件分割上传 本文是学习文件上传后的学习总结文章,从无到有实现文件上传功能,前端小白写的代码不是最优,如果有错误的地方请多多指教,如果本文对你有所帮助,深感荣幸. 近期公司的项目中,涉及到上传大文件的问题,大文件上传用普通表单上传时出现的问题是,无法断点续存,一但中途中断上传,就要重头开始,这很明显不是我们想要的,所以经过一番查询,学习了一下大文件分割上传的方法.并且使用简

文件上传功能实现(一)

文件上传: ①上传前的准备工作(准备一个注册的表单页面) 创建一个文件上传的控件,点击这个控件就可以选择需要上传的文件了 <form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="headimg" /> 注意:上传时表单的上传类型必须是:multipart/