第一步:创建项目
新建一个项目,先点击左边的spring,然后再点击右边的Spring MVC,点击后,下面的Web Application也会自动勾上,然后点击下一步Next,然后是给项目起名字以及配置项目目录,成功后,点击finish。需要加载一会儿。
第二步:配置项目
配置Tomcat
点击最上面一排目录的run,然后点击Edit Configurations,弹出一个页面,点击左上角的Templates旁边的小三角,然后翻到最底下,点开Tomcat Server,再点击Local,然后点击右上角的Configure....按钮,配置你的Tomcat,然后点击右下角apply按钮,别关闭此页面,然后点击左上角的加号+,点击最下面一个,然后再点开Tomcat Server,再点击Local,然后点击右边apply按钮上面的fix按钮,然后点击apply,关闭这个界面。
导入jar包
点击File按钮,然后点击Project Structure...这个按钮,弹出一个页面(这个页面分为左中右三部分),左边选中 Artifacts,然后点击最右部分的 Output.Layout ,然后点击它下面的一个加号+,选择Library Files,然后选中其中的两个jar包,并点击OK;接着点击apply上面的fix按钮,点击Add all...开头的那一行(我的是第二行),然后点击apply按钮。
然后最左部分选中Modules,然后点击最右部分的加号+,选择第一个,在弹出的页面里选择要添加的jar包,这一步可以反复操作,把所需要的jar包都添加上。然后点击apply,不要关闭该页面。
接下来点击最左侧的Artifacts,发现有警告,点击左侧apply按钮上面的fix按钮,选择第二个Add all...开头的,然后点击OK,关闭掉这个界面。jar包就添加成功了。
配置Spring-MVC.xml文件(idea中是dispatcher-servlet.xml文件)
先添加这个:
<context:component-scan base-package=" 你的package名 "/> |
再添加这个:
上传文件就必须配置上传文件所需要的东西。(直接将下面这段话copy进去就可以)
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />
<property name="maxUploadSize" value="10240000" />
<!-- 设置在文件上传时允许写到内存中的最大值,以字节为单位计算,默认是10240 -->
<!-- 但是经实验,上传文件大小若小于此参数,则不会生成临时文件,故改为2048 -->
<property name="maxInMemorySize" value="2048" />
</bean>
|
注意name为 “maxInMemorySize”的这个property,如果你上传的文件的大小小于2048kb,则不会生成临时文件,这个你可以根据需求改变一下,在我的项目中,我把它改为了10,就是把value的值改为“10”。
配置web.xml文件
首先把web.xml文件中的下面这部分 修改一下。
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.form</url-pattern> 改为: <url-pattern> / </url-pattern>
</servlet-mapping> |
修改后为:
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> |
接着,由于上传之后,我们要验证文件是否上传成功了,我们就需要访问上传到该项目的文件,这个文件是一个静态文件,为了能够访问这个静态文件,就需要添加相应的配置,SpringMVC访问静态文件,有多种方法,我自己用的是最笨的一种,因为我也是新手。方法如下:
将下面的内容copy到web.xml文件中,要放在<web-app>标签之间啊。
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.xml</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.swf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.zip</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping> |
这样,常用的静态文件格式就都可以访问了,这个很简单,一看就会,你看还需要添加什么样的格式,可以自己添加。
已经说了,我这种办法是最笨的办法,你可以使用别的方法,只要能让SpringMVC访问到静态资源就可以。
第三步:创建controller类
在src下创建一个controller的package,然后在其中添加一个FileUploadController类,具体代码如下:
package 。。。。。。
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
@Controller
public class FileUploadController {
@RequestMapping("/upload")
public String uploadFile(@RequestParam("file1") MultipartFile file1,HttpServletRequest request) throws Exception{
String filePath=request.getServletContext().getRealPath("/");
System.out.println(filePath);
file1.transferTo(new File(filePath+"123/"+file1.getOriginalFilename()));
return "redirect:success.html";
}
}
|
其中,@RequestParam("file1") 表示,前端的form表单中的 type类型的的input 的name为file1,为了一致,我把后面的MultipartFile类型的参数也设置为了file1。
String filePath=request.getServletContext().getRealPath("/"); 返回的是项目在容器中的实际发布运行的根路径;
file1.transferTo(new File(filePath+"123/"+file1.getOriginalFilename())); 其中的file1.getOriginalFilename(),是获取上传的文件的本来的名称。所以这行代码的意思就是将这个上传后的文件放到 根目录的“123”目录下,并且名称为以前的名称。(之所以使用123作为目录的名称,是因为之前使用英文名称的时候,可能由于编码的问题,出现了差错,可以换成别的名称) 因此,需要在web(webapp)目录下创建一个名为123的空目录。
在根目录即web(webapp)中创建一个名为“123”的空目录。
上传成功后,会重定向到 success.html界面,因此还要在根目录(web或webapp)添加一个success.html文件。内容自己随便写。
第四步 添加前端页面
idea创建的项目默认有一个index.jsp文件,我就把上传的前端页面写在这个文件里了
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
<table>
<tr>
<td colspan="2">文件上传</td>
</tr>
<tr>
<td>第一个文件</td>
<td>
<input type="file" name="file1" id="file1"/>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="上传文件"/>
</td>
</tr>
</table>
</form>
</body>
</html>
|
form标签的action属性最好写成绝对路径,因为要上传文件,所以还需要加上enctype="multipart/form-data" 属性,另外,选择文件的<input>标签的name属性必须与controller类中的 @RequestParam("file1") 相同。应该再没有什么要注意的了。
这就应该差不多了。
刚才又实践了一遍这个文件上传的功能,果然又获取到了点东西,我之前在web目录下创建一个upload目录,然后让上传功能将文件上传到这个目录中去。我刚才这样做了一遍,发现出错了,然后我就输出获取到的文件的路径,然后直接在本地文件中打开,发现,真正的本地路径并不是在web下,而是在out路径下,而我创建的upload在web中,所以获取到的路径中根本就没有这个目录,所以一直都报找不到路径。
解决办法:我手动在获取到的路径下创建了一个upload目录,这样就好了。看来我上次是运气好,才实现了那个功能。