spring mvc上传文件服务器配置
来源:互联网 发布:linux traceroute ping 编辑:程序博客网 时间:2024/05/22 13:09
在使用springMVC进行系统实现时,springMVC默认的解析器里面是没有加入对文件上传的解析的。但如果你想使用springMVC对文件上传的解析器来处理文件上传的时候就需要在spring的applicationContext里面加上springMVC提供的MultipartResolver的申明。客户端每次进行请求的时候,springMVC都会检查request里面是否包含多媒体信息,如果包含了就会使用MultipartResolver进行解析,springMVC会使用一个支持文件处理的MultipartHttpServletRequest来包裹当前的HttpServletRequest,然后使用MultipartHttpServletRequest就可以对文件进行处理了。Spring已经为我们提供了一个MultipartResolver的实现,我们只需要拿来用就可以了,那就是org.springframework.web.multipart.commons.CommsMultipartResolver。因为springMVC的MultipartResolver底层使用的是Commons-fileupload,所以还需要加入对Commons-fileupload.jar的支持。
首先,配置文件添加
<!-- 这里申明的id必须为multipartResolver --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- one of the properties available; the maximum file size in bytes --> <property name="maxUploadSize" value="100000"/> </bean>
CommonsMultipartResolver允许设置的属性有:
defaultEncoding:表示用来解析request请求的默认编码格式,当没有指定的时候根据Servlet规范会使用默认值ISO-8859-1。
当 request自己指明了它的编码格式的时候就会忽略这里指定的 defaultEncoding。
uploadTempDir:设置上传文件时的临时目录,默认是Servlet容器的临时目录。
maxUploadSize:设置允许上传的最大文件大小,以字节为单位计算。当设为-1时表示无限制,默认是-1。
maxInMemorySize:设置在文件上传时允许写到内存中的最大值,以字节为单位计算,默认是10240。
然后在 Controller 层就可以接收到了。再转到imp去处理
@Controller public class Controller { @RequestMapping(value = "/upload", method=RequestMethod.POST) public String handleFormUpload(@RequestParam("name") String name, @RequestParam("file") MultipartFile file) { //当要同时上传多个文件时,可以给定多个MultipartFile参数 if (!file.isEmpty()) { //第一种获取文件存储 String ss = "xxx/xxxx/xxx.png"; byte[] bytes = file.getBytes(); BufferedOutputStream stream = new BufferedOutputStream( new FileOutputStream(new File(ss))); stream.write(bytes); stream.flush(); stream.close(); //第二种获取文件存储 String path = "xxx/xxxx/xxx/"; String fileName = "aaa.png"; File targetFile = new File( path , fileName); if(!targetFile.exists()){ targetFile.mkdirs(); } file.transferTo(targetFile); } } }
像平常不用框架的话,基本就是原生的 servlet上传了
这个用的是 jspsmartupload
@WebServlet(name="UploadImgServlet", urlPatterns={"/services/UploadImgServlet"})public class UploadImgServlet extends HttpServlet {// @Autowired// private BizDao bizDao; @Override public void init() throws ServletException {// ServletContext servletContext = this .getServletContext(); // WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext); // bizDao = (BizDao)ctx.getBean("bizDao" ); } public void doGet(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException { doPost(request, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html,charset=UTF-8"); SmartUpload smartUpload = new SmartUpload(); try { // 添加缓存 smartUpload.initialize(this.getServletConfig(), req, resp); smartUpload.upload(); com.jspsmart.upload.File smartFile = smartUpload.getFiles() .getFile(0); if (!smartFile.isMissing()) { String path = getServletContext().getRealPath(""); // address + fileName String saveFileName = path.substring(0 , path.lastIndexOf("\\") + 1) + "upload" + "/" + smartFile.getFileName(); System.out.println("===saveFileName==="+ saveFileName); // 保存图片 smartFile.saveAs(saveFileName, smartUpload.SAVE_PHYSICAL); resp.getWriter().print("http://192.168.0.149:8081/upload/" + smartFile.getFileName()); } else { resp.getWriter().print("0"); } } catch (Exception e) { resp.getWriter().print("0"); e.printStackTrace(); resp.getWriter().print(e); } }}
原生的慢慢解析http协议的方式
@WebServlet(name="ImageUploadServlet", urlPatterns={"/services/imageUpload"})public class ImageUploadServlet extends HttpServlet { private static Logger logger = LoggerFactory.getLogger(ImageUploadServlet.class); private String rootDir = null; private String contextPath = null; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter writer = response.getWriter(); writer.write("call POST with multipart form data"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { logger.info("============================开始上传图片============================"); rootDir = this.getServletConfig().getServletContext().getRealPath("/");//项目根目录 contextPath = request.getContextPath(); System.out.println("=====rootDir==="+ rootDir); ResponseBean resp = new ResponseBean(); ServletFileUpload uploadHandler = new ServletFileUpload(new DiskFileItemFactory()); PrintWriter writer = response.getWriter(); uploadHandler.setHeaderEncoding("utf-8"); Map<String,String> fieldMap = new HashMap<String, String>(); Map<String, String> imageConfigMap = SysConfig.getImageServer("1"); System.out.println("====imageConfigMap==="+ imageConfigMap); try { System.out.println("request"+ request); List<FileItem> items = uploadHandler.parseRequest(request); System.out.println("==List<FileItem>=="+ items); for (FileItem item : items) { if(item.isFormField()){ String name = item.getFieldName(); BufferedReader br = new BufferedReader(new InputStreamReader(item.getInputStream())); StringBuffer sb = new StringBuffer(""); String line = null; while((line = br.readLine()) != null){ sb.append(line); } fieldMap.put(name, sb.toString().trim()); } } for (FileItem item : items) { if (!item.isFormField()) { String dirName = imageConfigMap.get("tempDir"); File fileDir = null; if(rootDir.trim().endsWith(File.separator)){ fileDir = new File(rootDir + dirName); }else{ fileDir = new File(rootDir + File.separator + dirName); } if(!fileDir.isDirectory()){ System.out.println("====创建文件夹"+ fileDir.getAbsolutePath()); fileDir.mkdirs(); } String fileName = DateTimeUtil.getTimeStamp()+CommonTool.getRandom(3,1000)+item.getName().substring(item.getName().lastIndexOf(".")); System.out.println("===文件名=="+ fileName ); File file = new File(fileDir.getPath()+"/"+fileName); if(!file.exists()){ file.createNewFile(); } item.write(file); //判断类型进行 图片的转换和 转移 handleImage(fieldMap, file, resp); break; // assume we only get one file at a time } } } catch (Exception e) { resp.setCode(2); resp.setMessage("上传失败:"+e.toString()); e.printStackTrace(); throw new RuntimeException(e); } finally { resp.setTimestamp(DateTimeUtil.getTimeStamp()); String result = JSON.toJSONString(resp); writer.write(result); logger.debug(result); logger.info("============================结束上传图片============================"); writer.close(); } } private void handleImage(Map<String,String> fieldMap, File imageFile, ResponseBean resp){ Map<String, String> imageConfigMap = SysConfig.getImageServer("1"); //开始事物// SqlSession session = SessionFactory.getSessionFactory().openSession(); File destFile = null; try { String imageType = fieldMap.get("ImageType"); //图片类型 System.out.println("==imageType=="+ imageType); if(imageType.equalsIgnoreCase("headPhotos")){ // 如果是头像 String user_id = fieldMap.get("UserId"); //用户ID String user_type = fieldMap.get("UserType"); //用户类型 System.out.println("==user_id=="+ user_id); System.out.println("==user_type=="+ user_type); File fileDir = null; if(rootDir.trim().endsWith(File.separator)){ fileDir = new File(rootDir + "images"+File.separator+imageType+File.separator+user_type); }else{ fileDir = new File(rootDir + File.separator + "images"+File.separator+imageType+File.separator+user_type); } if(!fileDir.isDirectory()){ fileDir.mkdirs(); } System.out.println("===fileDir.getPath()==="+ fileDir.getPath()); destFile = new File(fileDir.getPath()+File.separator+user_id+"_"+DateTimeUtil.getTimeStamp()+imageFile.getName().substring(imageFile.getName().lastIndexOf("."))); System.out.println("===destFile.getPath()==="+ destFile.getPath()); FileUtils.copyFile(imageFile, destFile); imageFile.delete();/** 数据插入 ImageDAO dao = session.getMapper(ImageDAO.class); **/ Map<String, Object> paramsMap = new HashMap<String,Object>(); paramsMap.put("id", user_id); paramsMap.put("user_type", user_type); paramsMap.put("head_photo", "images"+"/"+imageType+"/"+user_type+"/"+destFile.getName());/** int num = dao.modHeadPhoto(paramsMap); **/ System.out.println("======返回值========="); Map<String, Object> data = new HashMap<String,Object>(); data.put("image_name", destFile.getName()); data.put("image_url", imageConfigMap.get("showServer")+contextPath+"/"+paramsMap.get("head_photo")); resp.setData(data); } } catch (Exception e) { e.printStackTrace(); resp.setCode(3); resp.setMessage("上传失败:"+e.toString());// session.rollback(); } finally{ // session.commit(); try {// if(!session.getConnection().isClosed()){// session.close();// } } catch (Exception e) { e.printStackTrace(); } } }}
客户端测试,可以用工具
或者java 代码直接测
public class DDDD { public static void main(String[] args) { try { //普通参数 ArrayList<FormFieldKeyValuePair> ffkvp = new ArrayList<FormFieldKeyValuePair>(); //文件参数 ArrayList<UploadFileItem> ufi = new ArrayList<UploadFileItem>(); ffkvp.add(new FormFieldKeyValuePair("UserId", "50"));//其他参数 ffkvp.add(new FormFieldKeyValuePair("UserType", "cy")); ffkvp.add(new FormFieldKeyValuePair("ImageType", "headPhotos")); ffkvp.add(new FormFieldKeyValuePair("UserName", "啦啦啦啦啦")); ffkvp.add(new FormFieldKeyValuePair("Phone", "782738738")); // ffkvp.add(new FormFieldKeyValuePair("UserSex", "1")); // ffkvp.add(new FormFieldKeyValuePair("Email", "909090909090@qq.com")); // ffkvp.add(new FormFieldKeyValuePair("Address", "地址:")); ffkvp.add(new FormFieldKeyValuePair("IDcard", "09090909090909090")); ufi.add(new UploadFileItem("file","d://wowowo.png")); sendHttpPostRequest("http://192.168.0.197:8091/Server/services/imageUpload", ffkvp,ufi);// // sendHttpPostRequest("http://192.168.0.197:8091/Server/user/changeInfo.do",// ffkvp,ufi); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 每个post参数之间的分隔。随意设定,只要不会和其他的字符串重复即可。 private static final String BOUNDARY = "----------HV2ymHFg03ehbqgZCaKO6jyH"; public static String sendHttpPostRequest(String serverUrl, ArrayList<FormFieldKeyValuePair> generalFormFields, ArrayList<UploadFileItem> filesToBeUploaded) throws Exception { // 向服务器发送post请求 URL url = new URL(serverUrl/* "http://127.0.0.1:8080/test/upload" */); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 发送POST请求必须设置如下两行 connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false); connection.setRequestMethod("POST"); connection.setRequestProperty("Connection", "Keep-Alive"); connection.setRequestProperty("Charset", "UTF-8"); connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); // 头 String boundary = BOUNDARY; // 传输内容 StringBuffer contentBody = new StringBuffer("--" + BOUNDARY); // 尾 String endBoundary = "\r\n--" + boundary + "--\r\n"; OutputStream out = connection.getOutputStream(); // 1. 处理文字形式的POST请求 for (FormFieldKeyValuePair ffkvp : generalFormFields) { contentBody.append("\r\n") .append("Content-Disposition: form-data; name=\"") .append(ffkvp.key + "\"") .append("\r\n") .append("\r\n") .append(ffkvp.value) .append("\r\n") .append("--") .append(boundary); } String boundaryMessage1 = contentBody.toString(); out.write(boundaryMessage1.getBytes("utf-8")); // 2. 处理文件上传 for (UploadFileItem ufi : filesToBeUploaded) { contentBody = new StringBuffer(); contentBody.append("\r\n") .append("Content-Disposition:form-data; name=\"") .append(ufi.formFieldName + "\"; ") // form中field的名称 .append("filename=\"") .append(ufi.fileName + "\"") // 上传文件的文件名,包括目录 .append("\r\n") .append("Content-Type:application/octet-stream") .append("\r\n\r\n"); String boundaryMessage2 = contentBody.toString(); out.write(boundaryMessage2.getBytes("utf-8")); // 开始真正向服务器写文件 File file = new File(ufi.fileName); DataInputStream dis = new DataInputStream(new FileInputStream(file)); int bytes = 0; byte[] bufferOut = new byte[(int) file.length()]; bytes = dis.read(bufferOut); out.write(bufferOut, 0, bytes); dis.close(); contentBody.append("------------HV2ymHFg03ehbqgZCaKO6jyH"); String boundaryMessage = contentBody.toString(); out.write(boundaryMessage.getBytes("utf-8")); // System.out.println(boundaryMessage); } out.write("------------HV2ymHFg03ehbqgZCaKO6jyH--\r\n" .getBytes("UTF-8")); // 3. 写结尾 out.write(endBoundary.getBytes("utf-8")); out.flush(); out.close(); // 4. 从服务器获得回答的内容 String strLine = ""; String strResponse = ""; InputStream in = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in,"utf-8")); while ((strLine = reader.readLine()) != null) { strResponse += strLine + "\n"; } System.out.print(strResponse); return strResponse; } static class FormFieldKeyValuePair { // such as "username" in "<inputtype="text" name="username"/>" public String key; // such as "Patrick" the abovementioned formfield "username" public String value; public FormFieldKeyValuePair(String key, String value){ this.key = key; this.value = value; } } static class UploadFileItem implements Serializable{ // such as "upload1" in "<inputtype="file" name="upload1"/>" public String formFieldName; // such as "E:\\some_file.jpg" public String fileName; public UploadFileItem(String formFieldName, String fileName){ this.formFieldName = formFieldName; this.fileName = fileName; } } }
- spring mvc上传文件服务器配置
- spring mvc配置上传文件的大小
- 零xml配置Spring MVC文件上传
- Spring MVC上传文件MultipartFile配置以及简单使用
- spring mvc 文件上传
- spring MVC 上传
- spring MVC 文件上传
- Spring MVC文件上传
- spring mvc 图片上传
- spring mvc 上传图片
- Spring MVC 图片上传
- Spring MVC文件上传
- spring mvc 文件上传
- Spring mvc 文件上传
- spring mvc 文件上传
- spring mvc 上传文件
- spring mvc 上传文件
- spring mvc 文件上传
- git使用
- andorid 学习笔记 模仿淘宝分类
- 互联网革命怎样影响了实体商业?
- 微信开发第三篇 微信开发者工具在线接口调试工具的使用介绍
- 在系统中管理启动项
- spring mvc上传文件服务器配置
- springmvc 整合多个数据源
- Git 常用命令整理
- Want to use ViewPager, cannot get android.support.* to be recognized?
- Hdu 1166
- 《C陷阱与缺陷》读书笔记
- 退避算法
- get和set方法
- MagicalRecord 增查改删 基本用法