Spring框架实现文件上传功能
程序员文章站
2024-02-11 23:41:40
在java中实现文件的上传有多种方式,如smartupload或是使用strus2,本文与大家分享使用spring框架中的multipartfile类来实例文件的上传。...
在java中实现文件的上传有多种方式,如smartupload或是使用strus2,本文与大家分享使用spring框架中的multipartfile类来实例文件的上传。
不啰嗦了,直接上干货。先是编写了一个实现文件上传的类fileuploadingutil,此类中定义了两个对外公开的方法,upload和getfilemap。
前者需要传入一个map参数,是用户提交的表单中的文件列表,最终返回值的也是一个map类型对象,其键名为上传的文件名称,键值为文件在服务器上的存储路径;后者主要是用于测试用途,非主要功能,看官可以忽略此方法。
package com.emerson.cwms.utils; import java.io.file; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; import java.util.date; import java.util.hashmap; import java.util.iterator; import java.util.map; import java.util.map.entry; import org.springframework.web.multipart.multipartfile; /** * 文件上传工具类 * * @author chris mao(zibing) * */ public class fileuploadingutil { /** * 服务器上的保存路径,在使用到上传功能的controller中对其进行赋值 */ public static string filedir = null; /** * 上传多个文件,返回文件名称和服务器存储路径列表 * * @param files * @return * @throws ioexception */ public static map<string, string> upload(map<string, multipartfile> files) throws ioexception { file file = new file(filedir); if (!file.exists()) { file.mkdir(); } map<string, string> result = new hashmap<string, string>(); iterator<entry<string, multipartfile>> iter = files.entryset().iterator(); while (iter.hasnext()) { multipartfile afile = iter.next().getvalue(); if (afile.getsize() != 0 && !"".equals(afile.getname())) { result.put(afile.getoriginalfilename(), uploadfile(afile)); } } return result; } /** * 上传单个文件,并返回其在服务器中的存储路径 * * @param afile * @return * @throws filenotfoundexception * @throws ioexception */ private static string uploadfile(multipartfile afile) throws ioexception { string filepath = initfilepath(afile.getoriginalfilename()); try { write(afile.getinputstream(), new fileoutputstream(filepath)); } catch (filenotfoundexception e) { logger.error("上传的文件: " + afile.getname() + " 不存在!!"); e.printstacktrace(); } return filepath; } /** * 写入数据 * * @param in * @param out * @throws ioexception */ private static void write(inputstream in, outputstream out) throws ioexception { try { byte[] buffer = new byte[1024]; int bytesread = -1; while ((bytesread = in.read(buffer)) != -1) { out.write(buffer, 0, bytesread); } out.flush(); } finally { try { in.close(); out.close(); } catch (ioexception ex) { } } } /** * 遍历服务器目录,列举出目录中的所有文件(含子目录) * @return */ public static map<string, string> getfilemap() { logger.info(fileuploadingutil.filedir); map<string, string> map = new hashmap<string, string>(); file[] files = new file(fileuploadingutil.filedir).listfiles(); if (files != null) { for (file file : files) { if (file.isdirectory()) { file[] files2 = file.listfiles(); if (files2 != null) { for (file file2 : files2) { string name = file2.getname(); logger.info(file2.getparentfile().getabsolutepath()); logger.info(file2.getabsolutepath()); map.put(file2.getparentfile().getname() + "/" + name, name.substring(name.lastindexof("_") + 1)); } } } } } return map; } /** * 返回文件存储路径,为防止重名文件被覆盖,在文件名称中增加了随机数 * @param name * @return */ private static string initfilepath(string name) { string dir = getfiledir(name) + ""; file file = new file(filedir + dir); if (!file.exists()) { file.mkdir(); } long num = new date().gettime(); double d = math.random() * num; return (file.getpath() + "/" + num + d.longvalue() + "_" + name).replaceall(" ", "-"); } /** * * @param name * @return */ private static int getfiledir(string name) { return name.hashcode() & 0xf; } }
controller代码,使用上述定义的fileuploadingutil类实现文件上传之功能。
package com.emerson.cwms.web; import java.io.ioexception; import java.util.iterator; import java.util.map; import java.util.map.entry; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.springframework.stereotype.controller; import org.springframework.ui.model; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestmethod; import org.springframework.web.multipart.multiparthttpservletrequest; import com.emerson.cwms.utils.fileuploadingutil; /** * 文件上传控制器 * * @author chris mao(zibing) * */ @controller @requestmapping(value = "/files") public class filecontroller { @requestmapping(value = "/", method = requestmethod.get) public string list(httpservletrequest request, httpservletresponse response, model model) { inifiledir(request); system.out.println(request.getattribute("files")); model.addattribute("files", fileuploadingutil.getfilemap()); return "files/list"; } @requestmapping(value = "/upload", method = requestmethod.post) public string doupload(httpservletrequest request) { inifiledir(request); try { multiparthttpservletrequest mrequest = (multiparthttpservletrequest) request; map<string, string> uploadedfiles = fileuploadingutil.upload(mrequest.getfilemap()); iterator<entry<string, string>> iter = uploadedfiles.entryset().iterator(); while (iter.hasnext()) { entry<string, string> each = iter.next(); system.out.print("uploaded file name = " + each.getkey()); system.out.println(", saved path in server = " + each.getvalue()); } } catch (exception e) { e.printstacktrace(); } return "redirect:/files/"; } private void inifiledir(httpservletrequest request) { fileuploadingutil.filedir = request.getsession().getservletcontext().getrealpath("/") + "files/"; if (fileuploadingutil.filedir == null) { fileuploadingutil.filedir = request.getsession().getservletcontext().getrealpath("/") + "files/"; } } }
注意事项:一定要在pom.xml文件中添加对commons-fileupload的依赖引用,否则代码在运行时会提示找不到fileitemfactory类的错误。
依赖引用如下。
<dependency> <groupid>commons-fileupload</groupid> <artifactid>commons-fileupload</artifactid> <version>1.3.1</version> </dependency>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。