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

 

 

 

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

 

posted @ 2018-03-06 22:07  QiaoZhi  阅读(520)  评论(0编辑  收藏  举报