利用springMVC实现文件及图片上传功能,它主要是有MultipartResolver来实现的,我们通过配置这个MultipartResolver,可以实现我们的图片上传的方法。
1.配置之前准备,这里我们需要用到两个包
commons-fileupload和commons-io
2.我这里在myeclipse环境引入相应jar包
3.在xxx-servlet.xml里面输入我们的bean,multipartResolver
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8" p:maxUploadSize="52428800" p:uploadTempDir="upload/temp" />4.创建一个接收图片的方法uploadimg,参数是MultipartFile类型的,还有HttpServletRequest。具体实现可以看代码。
publicString uploadimg(MultipartFileavata,HttpServletRequestrequest){
Stringfileurl="";
{
if(avata.isEmpty()){
System.out.println("无法找到文件");
return"";
}else{
System.out.println("文件长度:"+avata.getSize());
System.out.println("文件类型:"+avata.getContentType());
System.out.println("文件名称:"+avata.getName());
System.out.println("文件原名:"+avata.getOriginalFilename());
System.out.println("========================================");
StringrealPath=request.getSession().getServletContext().getRealPath("/WEB-INF/yeehot");
FiletargetFile=newFile(realPath);
if(!targetFile.exists()){
targetFile.mkdirs();
}
System.out.println(realPath);
inti=avata.getOriginalFilename().lastIndexOf(".");//返回最后一个点的位置
Stringextension=avata.getOriginalFilename().substring(i+1);//取出扩展名
Stringfilename=UUID.randomUUID().toString()+"."+extension;
fileurl=filename;
try{
avata.transferTo(newFile(realPath,filename));
}catch(IllegalStateExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnfileurl;
}
}
}
5.创建一个controller.并且调用刚才上传图片的方法。最后打印图片的路径
publicclassUploafAvataController{
@ResponseBody
@RequestMapping(value="/uploadavata")
publicStringupload(@RequestParam(value="file",required=false)MultipartFilefile,HttpServletRequestrequest,ModelMapmodel){
Stringpath=uploadimg(file,request);
returnrequest.getContextPath()+"/yeehot/"+path;
}
}
6.创建上传图片的jsp,注意一点就是enctype,这里一点要知名上传的类型是"multipart/form-data",
<body>
<formaction="uploadavata"method="post"enctype="multipart/form-data">
选择文件:<inputtype="file"name="file">
<inputtype="submit"value="提交">
</form>
</body>
7.测试上传结果,输入我们的项目路径:
http://192.168.3.114:8080/Yeehot-Program-King/upload.jsp
点击提交后可以看到如下路径说明图片上传成功
我们可以从tomcat服务器的
/apache-tomcat-7.0.69/webapps/Yeehot-Program-King/WEB-INF/yeehot目录下找到我们的图片
对于上传多图片的方法。
我们可以使用MultipartFile[]数组。我们把原来的代码改成如下
1、上传图片的方法,这里我输出为json数组。
publicStringuploadimgs(MultipartFile[]avatas,HttpServletRequestrequest){
Stringfileurl="";
JSONArrayimgArray=newJSONArray();
for(MultipartFileavata:avatas){
if(avata.isEmpty()){
System.out.println("无法找到文件");
}else{
System.out.println("文件长度:"+avata.getSize());
System.out.println("文件类型:"+avata.getContentType());
System.out.println("文件名称:"+avata.getName());
System.out.println("文件原名:"+avata.getOriginalFilename());
System.out.println("========================================");
StringrealPath=request.getSession().getServletContext().getRealPath("/WEB-INF/yeehot");
FiletargetFile=newFile(realPath);
if(!targetFile.exists()){
targetFile.mkdirs();
}
System.out.println(realPath);
inti=avata.getOriginalFilename().lastIndexOf(".");//返回最后一个点的位置
Stringextension=avata.getOriginalFilename().substring(i+1);//取出扩展名
Stringfilename=UUID.randomUUID().toString()+"."+extension;
fileurl=filename;
JSONObjectjsonObject=newJSONObject();
jsonObject.put("img",fileurl);
imgArray.add(jsonObject);
try{
avata.transferTo(newFile(realPath,filename));
}catch(IllegalStateExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
returnimgArray.toString();
}
2、在controller编写接受的方法
@ResponseBody
@RequestMapping(value="/uploadavatamulti")
publicStringuploadmul(@RequestParam(value="files",required=false)MultipartFile[]file,HttpServletRequestrequest,ModelMapmodel){
//Stringpath=uploadimg(file,request);
Stringpath=uploadimgs(file,request);
returnpath;
}
3、编写上传多文件的JSP。注意这里file的name="files"要和controller的一致。
<formaction="uploadavatamulti"method="post"enctype="multipart/form-data">
选择文件:<inputtype="file"name="files"><br>
选择文件:<inputtype="file"name="files"><br>
选择文件:<inputtype="file"name="files"><br>
<inputtype="submit"value="提交">
</form>
4、测试多文件上传
http://192.168.3.114:8080/Yeehot-Program-King/uploadmul.jsp
注意,可能会出现org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException:therequestwasrejectedbecauseitssize(249681)exceedstheconfiguredmaximum(204800)
这是由于我们刚刚限制文件上传的大小。这里超过了我们的文件最大值,这里是所有文件的大小。解决办法,我们可以增加文件上传的大小。我这里就用2048000.
<!--文件上传表单的视图解析器-->
<beanid="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--oneofthepropertiesavailable;themaximumfilesizeinbytes-->
<propertyname="maxUploadSize"value="2048000"/>
</bean>
如果上传成功会返回如下的数据。
[
{
"img":"10edd053-52f0-4a14-a8e0-93cbcd8f60bd.png"
},
{
"img":"7547f880-e23f-40e6-b8bc-f4f9b30d6edf.png"
},
{
"img":"7c29cab1-b2e4-406e-871b-800b4f26698b.png"
}
]