文件的上传与下载及解决文件重名问题

Upload

文件上传

文件上传首先在前端页面form表单中需要添加属性enctype=“multipart/form-data” 代表用于发送二进制的文件

获取磁盘工厂对象DiskFileItemFactory

//1.创建磁盘工厂对象
    DiskFileItemFactory factory = new DiskFileItemFactory();

通过工厂对象获得上传对象ServletFileUpload

//2.通过工厂对象创建上传对象
    ServletFileUpload servletFileUpload = new ServletFileUpload(factory);

通过上传对象解析请求返回list集合

//3.通过上传对象解析前端发送的复合型表单数据
    List<FileItem> list=null;
    try {
        list = servletFileUpload.parseRequest(request);

遍历list集合

for(FileItem fileItem :list){}

根据是否为文本信息进行处理

if(!fileItem.isFormField()){

获得绝对路径:getServletContext().getRealPath()

上传文件保存到磁盘中

private void upload1(HttpServletRequest request, HttpServletResponse response) {
    //1.创建磁盘工厂对象
    DiskFileItemFactory factory = new DiskFileItemFactory();
    //2.通过工厂对象创建上传对象
    ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
    //3.通过上传对象解析前端发送的复合型表单数据
    List<FileItem> list=null;
    try {
        list = servletFileUpload.parseRequest(request);
        for(FileItem fileItem :list){
            if(!fileItem.isFormField()){
                //4.获取输入流
                InputStream is = fileItem.getInputStream();
                //5.获取输出流
                FileOutputStream fos = new FileOutputStream("G:/file/" + fileItem.getName());
                byte[] bytes = new byte[1024];
                int len;
                while ((len=is.read(bytes))!=-1){
                    fos.write(bytes,0,len);
                }
                fos.close();
                is.close();
            }
        }
    } catch (FileUploadException | IOException e) {
        e.printStackTrace();
    }
}

上传文件保存到服务器中

//上传文件保存到服务器中
private void upload2(HttpServletRequest request, HttpServletResponse response) {
    //1.创建磁盘工厂对象
    DiskFileItemFactory factory = new DiskFileItemFactory();
    //2.通过工厂对象创建上传对象
    ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
    //3.通过上传对象解析前端发送的复合型表单数据
    List<FileItem> list=null;
    try {
        list = servletFileUpload.parseRequest(request);
        for(FileItem fileItem:list){
            //判断是否为非文本信息
            if(!fileItem.isFormField()){
                //通过全局对象获取绝对路径
                String path=getServletContext().getRealPath("Upload");
                File file = new File(path);
                //判断路径是否存在,不存在则新建
                if(!file.exists()){
                    file.mkdirs();
                }
                //输出路径,拼接文件名
                File newFile = new File(file, fileItem.getName());
                IOUtils.copy(fileItem.getInputStream(),new FileOutputStream(newFile));
            }
        }
    } catch (FileUploadException | IOException e) {
        e.printStackTrace();
    }
}

解决文件重名问题

方式一:修改图片的名字使用UUID–生成唯一的ID值

private void upload3(HttpServletRequest request, HttpServletResponse response) {
    //获取工厂对象
    DiskFileItemFactory factory = new DiskFileItemFactory();
    //通过工厂对象获取上传对象
    ServletFileUpload sfu = new ServletFileUpload(factory);
    //通过上传对象解析前端请求
    List<FileItem> list=null;
    try {
        list = sfu.parseRequest(request);
        //判断是否为非文本信息
        for(FileItem fItem:list)
            if (!fItem.isFormField()) {
                //方法一:修改图片的名字
                //使用UUID--生成唯一的ID值
                UUID uuid = UUID.randomUUID();
                //获取绝对路径
                String path = getServletContext().getRealPath("Upload");
                File file = new File(path);
                if(file.exists()){
                    file.mkdirs();
                }
                //file:此处file为路径  后面的为随机uuid值+文件名
                File file1 = new File(file, uuid.toString() + "-" + fItem.getName());
                IOUtils.copy(fItem.getInputStream(),new FileOutputStream(file1));
    } catch (FileUploadException | IOException e) {
        e.printStackTrace();
    }
}

方式二:通过时间来当做目录

private void upload3(HttpServletRequest request, HttpServletResponse response) {
    //获取工厂对象
    DiskFileItemFactory factory = new DiskFileItemFactory();
    //通过工厂对象获取上传对象
    ServletFileUpload sfu = new ServletFileUpload(factory);
    //通过上传对象解析前端请求
    List<FileItem> list=null;
    try {
        list = sfu.parseRequest(request);
        //判断是否为非文本信息
        for(FileItem fItem:list)
            if (!fItem.isFormField()) {
        //方法二:通过时间来当做目录
                //获取时间对象
                Date date = new Date();
                //获取时间格式对象
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/HH/mm/ss");
                String format = sdf.format(date);
                //获取绝对路径
                String upload = getServletContext().getRealPath("Upload");
                File file = new File(upload);
                if(!file.exists()){
                    file.mkdirs();
                }
                File file1 = new File(file, fItem.getName());
                IOUtils.copy(fItem.getInputStream(),new FileOutputStream(file1));

            }
    } catch (FileUploadException | IOException e) {
        e.printStackTrace();
    }
}

方法三,提示重名

//方法三:提示用户重名,需重新命名
                //判断文件是否上传
                if("".equals(fItem.getName())||fItem.getName()==null){
                    //未上传则提示选择图片上传
                    request.setAttribute("msg","请选择图片上传");
                    request.getRequestDispatcher("register.jsp").forward(request,response);
                    return;
                }else {
                    //获取已上传的文件绝对路径
                    String upload = getServletContext().getRealPath("Upload");
                    //路径和文件名拼接
                    File file = new File(upload, fItem.getName());
                    //判断文件是否存在
                    if(file.exists()){
                        request.setAttribute("msg","文件已存在,请重新命名");
                        request.getRequestDispatcher("register.jsp");
                        return;
                    }else {
                        new File(upload).mkdirs();
                        IOUtils.copy(fItem.getInputStream(),new FileOutputStream(file));
                    }
                }

存储完整的表单信息并展示图片

后台servlet代码

private void upload4(HttpServletRequest request, HttpServletResponse response) {
    //获取工厂对象
    DiskFileItemFactory factory = new DiskFileItemFactory();
    //通过工厂对象获取上传对象
    ServletFileUpload sfu = new ServletFileUpload(factory);
    //通过上传对象解析前端请求
    List<FileItem> list=null;
    //创建一个集合用于存放表单信息和图片
    HashMap<String,String> map = new HashMap<>();
    //获取学生对象
    Student student = new Student();
    try {
        list = sfu.parseRequest(request);
        //判断是否为非文本信息
        for(FileItem fItem:list)
            if (!fItem.isFormField()) {
                //方法一:修改图片的名字
                //使用UUID--生成唯一的ID值
                UUID uuid = UUID.randomUUID();
                //获取绝对路径
                String path = getServletContext().getRealPath("Upload");
                File file = new File(path);
                if(file.exists()){
                    file.mkdirs();
                }
                //file:此处file为路径  后面的为随机uuid值+文件名
                File file1 = new File(file, uuid.toString() + "-" + fItem.getName());
                IOUtils.copy(fItem.getInputStream(),new FileOutputStream(file1));
                //存储路径不能为绝对路径
                student.setImgurl("Upload/"+uuid.toString()+"-"+fItem.getName());
            }else {
                //通过key(getFieldNmae--表单的name属性值)获取value(getString--表单的value值)
                String s = map.get(fItem.getFieldName());
                if(s==null){//一次储存
                    map.put(fItem.getFieldName(),fItem.getString());
                }else {//多次储存(复选框)
                    map.put(fItem.getFieldName(),s+","+fItem.getString());
                }
            }
            //把map集合对象数据存放到student对象中
        BeanUtils.populate(student,map);
            request.setAttribute("student",student);
            request.getRequestDispatcher("show.jsp").forward(request,response);
    } catch (FileUploadException | IOException | IllegalAccessException | InvocationTargetException | ServletException e) {
        e.printStackTrace();
    }
}

前端代码

<body>
用户名:${student.username};<br/>
爱好:${student.hobby};<br/>
图片:<img src="${student.imgurl}">
</body>

Download

文件下载

前端提交图片的相对路径

<a href="DownloadServlet?path=Upload/2.jpg">下载</a>

获取图片名字拼接找到绝对路径

//获取文件路径
    String path = request.getParameter("path");
    //获取文件名
    String fileName = path.substring(path.lastIndexOf("/") + 1);
    //转码
    fileName = URLEncoder.encode(fileName, "utf-8");
    
//获取下载图片的绝对路径
    String realPath = getServletContext().getRealPath(path);

设置下载响应头

response.setHeader("Content-disposition","attachment;fileName="+fileName);

通过IO流进行图片拷贝

//获取输入流
    FileInputStream fileInputStream = new FileInputStream(realPath);
    //响应获取输出流
    ServletOutputStream outputStream = response.getOutputStream();
    IOUtils.copy(fileInputStream,outputStream);
    fileInputStream.close();
    outputStream.close();
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中实现文件上传重名的方法有多种方式,下面介绍两种常见的方法。 第一种方法是通过在文件名后添加随机字符串或时间戳来确保文件重名。可以使用`java.util.UUID`类生成唯一的随机字符串,或使用`java.time`包中的相关类获取当前时间戳作为文件名的一部分。示例如下: ```java import java.util.UUID; String originalFileName = "example.txt"; String fileExtension = originalFileName.substring(originalFileName.lastIndexOf(".")); String newFileName = UUID.randomUUID().toString() + fileExtension; // 上传文件,使用newFileName作为文件名 ``` 第二种方法是使用文件名的哈希值作为文件名的一部分。可以使用`java.security.MessageDigest`类来计算文件名的哈希值,然后将其与原始文件名拼接成新的文件名。示例如下: ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; String originalFileName = "example.txt"; String fileExtension = originalFileName.substring(originalFileName.lastIndexOf(".")); String hash = ""; try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(originalFileName.getBytes()); byte[] digest = md.digest(); StringBuilder sb = new StringBuilder(); for (byte b : digest) { sb.append(Integer.toHexString((b & 0xFF) | 0x100).substring(1, 3)); } hash = sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } String newFileName = hash + fileExtension; // 上传文件,使用newFileName作为文件名 ``` 以上是两种常见的实现方式,可以根据具体的需求选择适合的方法来确保文件上传重名

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值