zoukankan      html  css  js  c++  java
  • SpringMVC上传文件

    1.配置上传解析器(必须配置,否则收不到文件)

    在springmvc.xml中配置文件上传解析器

    <!-- 文件上传,id必须设置为multipartResolver -->
    
    <bean id="multipartResolver"
    
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    
        <!-- 设置文件上传大小 -->
    
        <property name="maxUploadSize" value="5000000" />
    
    </bean>

    2. jsp页面修改

      在商品修改页面,打开图片上传功能,如下图:

     

    设置表单可以进行文件上传,如下图:

     

    3. 图片上传

    在更新商品方法中添加图片上传逻辑

    /**
    
     * 更新商品
    
     *
    
     * @param item
    
     * @return
    
     * @throws Exception
    
     */
    
    @RequestMapping("updateItem")
    
    public String updateItemById(Item item, MultipartFile pictureFile) throws Exception {
    
        // 图片上传
    
        // 设置图片名称,不能重复,可以使用uuid
    
        String picName = UUID.randomUUID().toString();
    
     
    
        // 获取文件名
    
        String oriName = pictureFile.getOriginalFilename();
    
        // 获取图片后缀
    
        String extName = oriName.substring(oriName.lastIndexOf("."));
    
     
    
        // 开始上传
    
        pictureFile.transferTo(new File("C:/upload/image/" + picName + extName));
    
     
    
        // 设置图片名到商品中
    
        item.setPic(picName + extName);
    
        // ---------------------------------------------
    
        // 更新商品
    
        this.itemService.updateItemById(item);
    
     
    
        return "forward:/itemEdit.action";
    
    }

    效果,如下图:

     

    补充:针对上述方法可以编写一个工具类,对上传的文件进行处理:

      将MultipartFile作为参数传到工具类中,并传入一个path.properties的key以及需要生成的文件的名字,如果是word文件需要转成pdf重新存一份,如果是其他则直接存入即可。例如

    package cn.xm.jwxt.utils;
    
    import org.apache.commons.io.FileUtils;
    import org.apache.commons.io.FilenameUtils;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.*;
    import java.util.Locale;
    import java.util.ResourceBundle;
    
    /**
     * @Author: qlq
     * @Description 文件处理类
     * @Date: 22:59 2018/4/9
     */
    public class FileHandleUtil {
        /******S   封装的读取properties文件****************/
        /**
         * 系统语言环境,默认为中文zh
         */
        public static final String LANGUAGE = "zh";
    
        /**
         * 系统国家环境,默认为中国CN
         */
        public static final String COUNTRY = "CN";
    
        private static String getProperties(String baseName, String section) {
            String retValue = "";
            try {
                Locale locale = new Locale(LANGUAGE, COUNTRY);
                ResourceBundle rb = ResourceBundle.getBundle(baseName, locale);
                retValue = (String) rb.getObject(section);
            } catch (Exception e) {
                e.printStackTrace();
                // TODO 添加处理
            }
            return retValue;
        }
        /**
         * 通过key从资源文件读取内容
         *
         * @param fileName
         *            资源文件名
         *
         * @param key
         *            索引
         *
         * @return 索引对应的内容
         */
        public static String getValue(String fileName, String key) {
            String value = getProperties(fileName,key);
            return value;
        }
        /******E   封装的读取properties文件****************/
    
    
        /**********S  保存文件相关操作**************/
        /**
         * 配置虚拟路径上传文件到本地磁盘
         * @param f  需要上传的文件
         * @param fileName    保存到磁盘的文件名
         * @param pathKey    资源文件中的键 path.properties
         */
        public static void uploadFileToDisk(File f,String fileName,String pathKey){
            //从资源文件中读取文件的基本目录
            String basePath = ResourcesUtil.getValue("path", pathKey);
            //获取文件的后缀
            String sufix = FilenameUtils.getExtension(fileName);
            //获取文件的前缀
            String prefix = FilenameUtils.getBaseName(fileName);
            //保存到硬盘的文件的完整路径
            String dir = basePath+fileName;
            try{
                InputStream streamIn = new FileInputStream(f);
                OutputStream streamOut = new FileOutputStream(new File(dir));
                int bytesRead=0;
                byte[] byffer = new byte[8192];
                while((bytesRead=streamIn.read(byffer,0,8192))!=-1){
                    streamOut.write(byffer, 0, bytesRead);
                }
                streamIn.close();
                streamOut.flush();
                streamOut.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            //如果文件是doc或者docx文件将文件转为pdf存一份到服务器
            if("doc".equals(sufix)||"docx".equals(sufix)){
                try {
    //                Word2PdfUtil.word2pdf(dir, basePath+prefix+".pdf");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**********E  保存文件相关操作**************/
    
    
    
    
    
        /******************S  删除文件相关操作********/
        /**
         *删除word(有可能后缀是doc,docx,或者转换后的pdf文件)
         * @param propertiesKey    path.properties文件中的key(确定目录)
         * @param fileName     需要删除的文件的名字(确定删除哪个文件)
         * @return    删除结果
         */
        public static boolean deleteWordOrPdfFile(String propertiesKey,String fileName) {
            if (fileName == null) {
                return false;
            }
            String dir = FileHandleUtil.getValue("path", propertiesKey);// 获取文件的基本目录
            String baseName = FilenameUtils.getBaseName(fileName);// 获取文件的基本名字(借助commons-io包读取文件基本名称)
            try {
                FileUtils.deleteQuietly(new File(dir + baseName + ".pdf"));
                FileUtils.deleteQuietly(new File(dir + baseName + ".doc"));
                FileUtils.deleteQuietly(new File(dir + baseName + ".docx"));
            } catch (Exception e) {
                e.printStackTrace();
            }
            return true;
        }
        /**
         *删除普通的文件(jpg,word,pdf)
         * @param propertiesFileName        properties文件的名称(确定读取哪个properties文件)
         * @param propertiesKey    properties文件中的key(确定目录)
         * @param fileName     需要删除的文件的名字(确定删除哪个文件)
         * @return    删除结果
         */
        public static boolean deletePlainFile(String propertiesFileName,String propertiesKey,String fileName) {
            if (fileName == null) {
                return false;
            }
            String dir = FileHandleUtil.getValue(propertiesFileName, propertiesKey);// 获取文件的基本目录
            try {
                //删除文件
                FileUtils.forceDeleteOnExit(new File(dir + fileName));
            } catch (IOException e) {
                e.printStackTrace();
            }
            return true;
        }
        /****************E  删除文件相关操作**************/
    
    
    
        /*******  S针对SptingMVC的上传文件的处理  *************/
        /**
         * 专门针对SpringMVC的文件上传操作
         * @param multipartFile 文件参数
         * @param propertiesKey  需要读取的path里面的key
         * @param fileName  文件名字,比如:    ce5bd946fd43410c8a26a6fa1e9bf23c.pdf
         * @return 返回值是最后的文件名字,如果是word需要转成pdf,1.doc返回值就是1.pdf
         */
        public static String uploadSpringMVCFile(MultipartFile multipartFile,String  propertiesKey,String fileName) throws Exception {
            String fileDir = FileHandleUtil.getValue("path", propertiesKey);// 获取文件的基本目录
            //1.将文件保存到指定路径
            multipartFile.transferTo(new File(fileDir+fileName));//保存文件
            //2.根据文件后缀判断文件是word还是pdf,如果是word需要转成pdf,其他的话不做处理
            String fileNameSuffix = FilenameUtils.getExtension(fileName);//调用io包的工具类获取后缀
            if("doc".equals(fileNameSuffix)||"docx".equals(fileNameSuffix)){//如果后缀是doc或者docx的话转为pdf另存一份
                String fileNamePrefix = FilenameUtils.getBaseName(fileName);//获取文件前缀名字
                Word2PdfUtil.word2pdf(fileDir+fileName,fileDir+fileNamePrefix+".pdf");//进行word转换pdf操作
                fileName = fileNamePrefix+".pdf";//并将文件的名字换成新的pdf名字
            }
            return fileName;
        }
        /*******  E针对SptingMVC的上传文件的处理  *************/
    
    
    
    
    
    
    }

    path.properties

    #教学资料上传路径(最后一个/必须加上)
    teachingFile=G:/jwxt/teachingFile/

    Action层调用:

        @RequestMapping("/upload")
        public @ResponseBody
        ResposeResult uploadTeachingProgramFile(TTeachingprogramInfo teachingprogramInfo, MultipartFile file){
            //1.将文件保存到磁盘
            String fileoriname=null;//原名称
            String filenowname=null;//系统生成的名称
            if(file!=null){
                fileoriname=file.getOriginalFilename();//获取文件原始名字
                filenowname = UUIDUtil.getUUID2()+"."+ FilenameUtils.getExtension(fileoriname);//新生产一个文件
            }
            try {
                filenowname = FileHandleUtil.uploadSpringMVCFile(file,"teachingFile",filenowname);//获取传完之后新的名字
            } catch (Exception e) {
                logger.error("保存文件出错",e);
            }
            //2.保存数据库
            teachingprogramInfo.setFilenowname(filenowname);//设置UUID生成的名字
            teachingprogramInfo.setFileoriname(fileoriname);//设置原始名字
            String result=null;
            //返回ajax请求的工具类
            ResposeResult resposeResult = new ResposeResult();
            try {
                result = teachingProgramInfoService.addTeachingProgramInfo(teachingprogramInfo)?"上传成功":"保存失败";
            } catch (SQLException e) {
                result = "保存失败";
                resposeResult.setSuccess(false);
                logger.error("保存课程资料到数据库出错");
            }
            resposeResult.setMsg(result);
            return resposeResult;
        }

      对于多文件的上传,将参数换成数组即可。

  • 相关阅读:
    HTTP协议
    javascript常用数组排序及二分查找
    垃圾回收与内存管理
    js的数据存储机制和数据类型
    js中的深复制与浅复制
    斐波那契数列的实现
    认识python中的浅复制与深复制
    微信浏览器中弹窗高度适配
    “ 时,分,秒” 活动倒计时
    互联网协议
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/8519464.html
Copyright © 2011-2022 走看看