关于使用spring文件上传遇到的服务器中的图片访问不到报404的问题

这个问题发生的环境是上传文件,我是用的spring文件上传,上传步骤如下:

首先,applicationContext.xml中配置好文件上传的bean:


之后导入所用到的jar包,一般来说,MyEclipse集成了spring框架之后,项目下就会自动添加了相关jar包,但是当你布置好了一系列文件上传步骤之后,一测试发现会报500错误,提示找不到类,或者报不是Multipart类型的request等异常,检查jsp,发现

中的enctype确实是“multipart/form-data”,后来实在没办法了,他前面提到过找不到类,那会不会是还有jar没有引进去呢,后来发现错误信息里有IOUtils这个字眼,发现项目中依赖的jar包有commons-io这个包,那为什么还会找不到呢,去tomcat的lib文件夹下看了一下,并没有这个jar包,索性把这个jar包考进去试一下,果不其然,不报错了,在这需要提别记录一下,项目中用到的jar包,最好tomcat的lib下也要添加上。

然后我们写一个上传文件的jsp界面(upload.jsp):

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>



  
    
    
    My JSP 'upload.jsp' starting page
    
	
	
	    
	
	
	

  
  
  
   ${errors}
   	
   		
   		
   	
   	


再写一个显示结果的界面(result.jsp):

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>



  
    
    
    My JSP 'result.jsp' starting page
    
	
	
	    
	
	
	

  
  
  
    	
    		查看
    	
    	
文件
然后,编写Controller组件:

package com.hardy.test;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class UploadController {

	@RequestMapping("/toUpload.do")
	public String toLoad(){
		return "upload";
	}
	
	@RequestMapping("/upload.do")
	public String upload(@RequestParam(value="file",required=false) MultipartFile file,HttpServletRequest request,ModelMap model){
		//getRealPath()得到的是磁盘上的真实路径,getContextPath()得到的是访问的虚拟路径s
		String path = request.getSession().getServletContext().getRealPath("upload");
		//得到上传文件的名字
		String fileName = file.getOriginalFilename();
		System.out.println(path);
		File targetFile = new File(path,fileName);
		//创建目录(file.mkdirs()创建路径中不存在的父目录;file.mkdir()只是创建最后的目录,如果路径中有一个目录不存在则创建失败)
		if(!targetFile.exists()){
			targetFile.mkdirs();
		}
		
		//保存
		try {
			file.transferTo(targetFile);
//			System.out.println(request.getContextPath()+"/upload/"+fileName);
			System.out.println(request.getLocalAddr());
			System.out.println(request.getContextPath());
			model.addAttribute("fileUrl", request.getContextPath()+"/upload/"+fileName);
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "result";
	}
	
	@RequestMapping("/uploadMore.do")
	public String uploadMore(@RequestParam(value="file",required=false) MultipartFile[] files,HttpServletRequest request,ModelMap model){
		List urls = new ArrayList();
		for(MultipartFile file:files){
			String path = request.getServletContext().getRealPath("upload");
			String fileName = file.getOriginalFilename();
			System.out.println(path);
			File targetFile = new File(path,fileName);
			if(!targetFile.exists()){
				targetFile.mkdirs();
			}
			//保存
			try {
				file.transferTo(targetFile);
				urls.add(request.getContextPath()+"/upload/"+fileName);
			} catch (IllegalStateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		model.addAttribute("fileUrls",urls);
		return "result";
	}

}

ModelMap是伴随着request的,所以我们直接给他添加上传文件在服务器中的路径即可,之后在result中通过key(“fileUrl”)或者集合来显示“查看”字样,点击“查看”,你会发现会出现404错误,这就是主问题,而问题的根本就是路径不对,之前我们在html中以链接的形式访问本地图片使用的是绝对路径,在这里只是相对路径,因为他存放在服务器中,所以查看server.xml文件可以看到Context标签下的appBase是webapps,所以它自动会去这个目录下寻找,所以我们只需要返回request.getContextPath+“/upload/”+fileName就能找到相关项目下的文件,这就是为什么fileUrl换成”http://localhost:8080/项目名/upload/文件名”也不行的原因。那这里报错会是什么原因呢,我想,这里和之前练习的唯一不同就是在这里我是用了spring框架,我在web.xml中是这么写的:


  	springMVC
  	org.springframework.web.servlet.DispatcherServlet
  	
  		contextConfigLocation
  		classpath:applicationContext.xml
  	
  	1
  
  
  
  	springMVC
  	/
  

这意味着所有的请求都会经过这个dispatcher,而他又是去查找地址映射的,所以实打实的文件位置的请求是无法被识别的,把url-pattern换成*.do只让.do后缀的请求经过Dispatcher即可,问题迎刃而解。

注意引用JSP的c:..标签时要先进行声明,否则可能会显示异常。

如何限制上传文件大小呢?

在CommonsMultipartResolver中有一个属性maxUploadSize可以设置大小限制:


		
		
	

此时上传一个大文件则会报错:

关于使用spring文件上传遇到的服务器中的图片访问不到报404的问题_第1张图片

你可能感兴趣的:(摸索)