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; }
对于多文件的上传,将参数换成数组即可。
【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】