java图片上传并解析_spring实现文件上传(图片解析)

合抱之木,生于毫末,千里之行,始于足下,要想了解spring的文件上传功能,首先要知道spring是通过流的方式将文件进行解析,然后上传。那么是不是所有需要用的文件上传的地方都要写一遍文件解析器呢?

放心,spring这个大管家已经为我们做好了一切!

我们只需要在spring的配置文件中加入下面代码:

error_fileupload

我们就不用再去在文件的解析上绞尽脑汁了,只需要专注于业务层面的逻辑就好了,是不是很简单?

接下来我们看一个小例子:

html前端代码:

Insert title here

/user/add"method="post"enctype="multipart/form-data">

新增用户

用户名:
密码:
头像:

大家有没有注意到以上代码的form表头中有一行代码:

enctype="multipart/form-data"

没错,想要上传二进制文件,该表头属性必不可少。

controller控制层代码:

packagecom.wskj.springmvc.controller;importjava.io.File;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importjavax.servlet.http.HttpServletRequest;importorg.springframework.stereotype.Controller;importorg.springframework.ui.Model;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.multipart.MultipartFile;importcom.wskj.springmvc.pojo.UserInfo;

@Controller

@RequestMapping("/user")public classUserController {

@RequestMapping(value="/add", method=RequestMethod.GET)publicString addUser(){return "user/add";

}

@RequestMapping(value="/add", method=RequestMethod.POST)public String addUser(Model model, UserInfo user, @RequestParam(name="photo", required=false) MultipartFile photo, HttpServletRequest request) throwsIOException{//对文件进行处理//判断用户是否上传了文件//MultipartFile.getSize() : 获取文件的大小(字节:byte) 1024byte = 1kb 1024kb=1mb GB TB PB

if(photo.isEmpty() == false && photo.getSize() > 0){//获取文件的名称

String name = photo.getName();//photo

String fileName = photo.getOriginalFilename();//mydata.jpg//获取文件扩展名

String extension = fileName.substring(fileName.lastIndexOf("."));byte[] data = photo.getBytes();//字节数组

String contentType =photo.getContentType();/*** 扩展名 Content-Type

* .txt text/plain

* .jpg image/jpeg

* .mp3 audio/mp3

* .mp4 video/mpeg4*/photo.getInputStream();//获取文件输入流//保存到磁盘//保存的路径//不是 -》 F:\java\workspace\spring\springmvc_fileupload_20170401\WebContent\files//是 -》 x:\apache tomcat-7\webapps\appName\files

String savedPath = request.getServletContext().getRealPath("files");//获取files目录的绝对路径

String filePath = savedPath + "/" +fileName;//将文件写入磁盘

photo.transferTo(newFile(filePath));//设置UserInfo.headerPhoto

user.setHeaderPhotoUrl("files/"+fileName);

model.addAttribute("headerUrl", user.getHeaderPhotoUrl());

}

model.addAttribute("user", user);return "user/success";

}

@RequestMapping(value="/add2", method=RequestMethod.GET)publicString addUser2(){return "user/add2";

}

@RequestMapping(value="/add2", method=RequestMethod.POST)public String addUser2(Model model, UserInfo user, @RequestParam(name="photos", required=false) MultipartFile[] photos, HttpServletRequest request) throwsIOException{//对文件进行处理

if(photos != null && photos.length>0){

List photoUrls = new ArrayList();for(MultipartFile photo : photos){//判断用户是否上传了文件//MultipartFile.getSize() : 获取文件的大小(字节:byte) 1024byte = 1kb 1024kb=1mb GB TB PB

if(photo.isEmpty() == false && photo.getSize() > 0){//获取文件的名称

String name = photo.getName();//photo

String fileName = photo.getOriginalFilename();//mydata.jpg//获取文件扩展名

String extension = fileName.substring(fileName.lastIndexOf("."));byte[] data = photo.getBytes();//字节数组

String contentType =photo.getContentType();/*** 扩展名 Content-Type

* .txt text/plain

* .jpg image/jpeg

* .mp3 audio/mp3

* .mp4 video/mpeg4*/photo.getInputStream();//获取文件输入流//保存到磁盘//保存的路径//不是 -》 F:\java\workspace\spring\springmvc_fileupload_20170401\WebContent\files//是 -》 x:\apache tomcat-7\webapps\appName\files

String savedPath = request.getServletContext().getRealPath("files");//获取files目录的绝对路径

String filePath = savedPath + "/" +fileName;//将文件写入磁盘

photo.transferTo(newFile(filePath));//设置UserInfo.headerPhoto

photoUrls.add("files/"+fileName);

}

}

model.addAttribute("headerUrl", photoUrls);

}

model.addAttribute("user", user);return "user/success2";

}

}

后台根据前段的name属性接收参数,二进制文件类型为

MultipartFile,如果需要接收多个文件,只需要设置成集合然后遍历即可。

接下来是上传成功前段回显的jsp代码:

Insert title here
用户名:
${user.userName }
头像:

/${headerUrl}" />

至此,最基础的文件上传测试成功。

6dd91f330790b137296f71a99bfa740b.png

38b693bc9855ad5aa6588c331597b2b3.png

但是,在实际项目中,我们可能只是需要启用一个div来进行文件的异步上传,这时我们可以使用html5的新特性formdata实现ajax的提交。

具体代码如下:

jsp前端代码:

Insert title here

/static/jquery-1.10.2.js">

$(function(){

$("#btnupload").click(function(){varformdata= newFormData(document.getElementById("form1"));//可以上传文件

//var formdata = $("#form1").serializeArray();//无法上传文件的

alert(formdata);varurl="/upload/demo1";

$.ajax({

url:url,

data:formdata,//name=zhangsan&age=50 {}

contentType:false,//默认: "application/x-www-form-urlencoded"

processData:false,//设置 processData 选项为 false,防止自动转换数据格式

type:"post",

dataType:"json",

success:function(data){

alert(data);

},

error:function(er){

alert(er.responseText);

}

});

});

});

使用Html5提供的FormData实现ajax提交

浏览器必须支持html5,如果是IE6 - IE8,那就洗洗睡吧...

文件名:文件:

我们可以看见,只需要给要提交的form表单指定一个唯一标识id即可,是不是很方便?

后台controller接收代码:

packagecom.wskj.uploadfile.controller;importjava.io.File;importjava.io.IOException;importjavax.servlet.http.HttpServletRequest;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.multipart.MultipartFile;

@Controller

@RequestMapping("/upload")public classAjaxController {

@RequestMapping(value="/demo1", method=RequestMethod.GET)publicString demo1(){return "upload/demo1";

}

@RequestMapping(value="/demo1", method=RequestMethod.POST)

@ResponseBodypublic boolean demo1(String fileName, MultipartFile myfile, HttpServletRequest request) throwsIllegalStateException, IOException{

String path= request.getServletContext().getRealPath("files");

path+= "/" +myfile.getOriginalFilename();

File file= newFile(path);

myfile.transferTo(file);

System.out.println(fileName+" - 上传成功");return true;

}}

另外还可以使用jquery.form.js实现ajax的上传:

前段jsp代码:

Insert title here

/static/jquery-1.10.2.js">

/static/jquery.form.js">

$(function(){

$("#btnupload").click(function(){varurl="/upload/demo2";

$("#form1").ajaxSubmit({

type:'post',

url:url,

clearForm:true,//清空所有表单元素的值

resetForm:true,//重置所有表单元素的值

success:function(data){

alert(data);

},

error:function(XmlHttpRequest,textStatus,errorThrown){

alert("上传失败了");

}

});

});

});

使用jquery.form.js实现ajax文件上传

对浏览器没有限制,尽情使用吧骚年们...

文件名:文件:

后台controller接收代码:

packagecom.wskj.uploadfile.controller;importjava.io.File;importjava.io.IOException;importjavax.servlet.http.HttpServletRequest;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.multipart.MultipartFile;

@Controller

@RequestMapping("/upload")public classAjaxController {@RequestMapping(value="/demo2", method=RequestMethod.GET)publicString demo2(){return "upload/demo2";

}

@RequestMapping(value="/demo2", method=RequestMethod.POST)

@ResponseBodypublic boolean demo2(String fileName, MultipartFile myfile, HttpServletRequest request) throwsIllegalStateException, IOException{

String path= request.getServletContext().getRealPath("files");

path+= "/" +myfile.getOriginalFilename();

File file= newFile(path);

myfile.transferTo(file);

System.out.println(fileName+" - 上传成功");return true;

}

}

当然,使用这两种方法也必须在spring中配置文件上传解析器,这个是上传二进制文件的前提。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值