zoukankan      html  css  js  c++  java
  • servlet实现图片上传工具类

    package com.donleo.ssm.utils;
    
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.util.List;
    
    /**
     * @author liangd
     * date 2020-11-24 18:25
     * code 图片上传工具类
     */
    public class UploadUtils {
    
        public static String save(HttpServletRequest req, HttpServletResponse resp) {
    
            //保存图片的路径
            String savePath = CommonPath.SAVE_PATH.getValue();
            //图片前面的具体路径
            String imgPath = CommonPath.IMG_PATH.getValue();
            //new一个file类
            File file = new File(savePath, imgPath);
            //判断文件夹是否存在,如果存在,是否是文件夹,否则创建文件夹
            if (!file.exists() && !file.isDirectory()) {
                file.mkdirs();
            }
            //返回地址
            String fileUrl ="";
            try {
                //创建DiskFileItemFactory工厂
                DiskFileItemFactory factory = new DiskFileItemFactory();
                //创建一个文件上传解析器
                ServletFileUpload upload = new ServletFileUpload(factory);
                //设置编码格式
                upload.setHeaderEncoding("UTF-8");
                //判断提交的数据是否是表单上的数据,multpart/form-data,如果不是,返回空字符串
                if (!ServletFileUpload.isMultipartContent(req)) {
    
                }
                //使用ServletFileUpload解析表单数据,返回的是List<FileItem>集合,需要进行遍历
                //将上传的数据强制转换为FileItem类型
                List<FileItem> list = upload.parseRequest(req);
                for (FileItem item : list) {
                    //判断表单是否是普通类型,text,select等都是普通类型,否则该表单是file类型
                    if (item.isFormField()) {
                        String name = item.getFieldName();
                        String value = item.getString("UTF-8");
                        req.setAttribute(name, new String(value.getBytes()));
                    } else {
                        //得到当前图片文件name名
                        String filesName = item.getFieldName();
                        //得到file文件名
                        String fileName = item.getName();
                        //判断文件名是否为空
                        if (fileName == null || "".equals(fileName.trim())) {
                            continue;
                        }
                        //substring截取字符串,如果上传的文件名前面有\\,最后一个\\后面的文件名
                        fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
    
                        //InputStream getInputStream(),以流的形式返回上传文件的数据内容。
                        InputStream inputStream = item.getInputStream();
    
                        //保存到数据库的路径
                        String dataPath = imgPath + fileName;
                        //图片的具体路径(全路径)
                        String imgUrl = savePath + dataPath;
    
                        //返回地址
                        fileUrl=dataPath;
                        //文件输出流
                        FileOutputStream fileOutputStream = new FileOutputStream(imgUrl);
                        //创建一个为1M的缓冲区
                        byte buffer[] = new byte[1024];
    
                        int length = 0;
                        //判断流是否已经读取完毕
                        while ((length = inputStream.read(buffer)) > 0) {
                            fileOutputStream.write(buffer, 0, length);
                        }
                        //关闭输入输出流,并删除临时文件
                        inputStream.close();
                        fileOutputStream.close();
                        item.delete();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return fileUrl;
        }
    }
    作者:donleo123
    本文如对您有帮助,还请多推荐下此文,如有错误欢迎指正,相互学习,共同进步。
  • 相关阅读:
    BIO、NIO、AIO有什么区别?
    java中IO流有哪些?
    List、Map、Set 三个接口,存取元素时,各有什么特点?
    Vector、ArrayList、LinkedList 的存储性能和特性?
    Java.util.Map的常用实现类有哪些?
    Java自学指南六、查一手资料
    虚拟机中Lvs配置
    m2014-software->Word2010发布博客文章至Cnblogs
    m2014-c->c模拟java的hashmap容器类
    m2014_c->c语言容器类工具列
  • 原文地址:https://www.cnblogs.com/donleo123/p/14068041.html
Copyright © 2011-2022 走看看