之前介绍了文件上传的原生方法,这次通过spring MVC提供的方法快速实现文件上传。
首先是基本jar包的基础上必须有 commons-fileupload-1.3.1.jar
配置spring MVC:
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--能配置多少个property,可以查文档和查询源代码 -->
<!--最大上传文件的大小 单位字节-->
<property name="maxUploadSize" value="8388608"></property>
<property name="resolveLazily" value="true"></property>
</bean>
controller:
@RequestMapping(value="fileUpload")
public String fileUpload(MultipartFile fx,Model model) throws IOException{
System.out.println(fx.getOriginalFilename());
FileUtils.writeByteArrayToFile(new File("d://"+fx.getOriginalFilename()),//存放路径
fx.getBytes());
model.addAttribute("msg", "上传成功!");
return "fileUpload";
}
前台表单:
<form action="${app}fileUpload.do" method="POST" enctype="multipart/form-data">
文件:<input type="file" name="fx"/>
<input type="submit" value="提交"/>${msg}
</form>
这样就实现了文件的上传。但我们通常实现上传以后还要进行读取,下面顺便写个io读取:
@RequestMapping(value="getImg")
@ResponseBody
public void createFolw(HttpServletRequest request,
HttpServletResponse response, Model model) {
// response.setContentType("image/*");
FileInputStream fis = null;
OutputStream os = null;
try {
fis = new FileInputStream("d://51f88071c08ea_120_80.jpg"); //imgurl
os = response.getOutputStream();
int len = 0;
byte[] array = new byte[1024];
while ((len = fis.read(array)) != -1) {
os.write(array, 0, len);
os.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
try {
fis.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
通常项目中不止会有一处需要文件上传, 可以统统调用此方法进行读取。为了代码整洁干练,也可以封装为一个util类:
public class ImgUtil extends HttpServlet {
private static final ServletOutputStream sos = null;
public static ServletOutputStream getFileImg(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//1. 获取请求参数-图片的url
String imgurl=req.getParameter("imgurl");
//2. 表单验证(略)
//3. 执行逻辑-通过输入流读取图片的内容,通过输出流写给用户
FileInputStream fis=null;
try {
// 根据图片url获取图片的真实路径
String realPath=req.getServletContext().getRealPath(imgurl);
// 需要的路径是图片在服务器上的绝对路径
fis=new FileInputStream(realPath);
// 获取向应答实体内容中输入内容的输出流
ServletOutputStream sos=resp.getOutputStream();
byte[] array=new byte[1024];
// 从服务器本地读取图片的一部分内容
int len=fis.read(array);
while(len!=-1){
//向应答实体内容中输出图片的内容
sos.write(array, 0, len);
len=fis.read(array);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(fis!=null){
fis.close();
}
}
return sos;
}
}
这样调用就会好看很多:
@RequestMapping(value = "getFileImg")
public OutputStream getFileImg(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException{
OutputStream movieImg = ImgUtil.getFileImg(req, resp);
return movieImg;
}
慢慢进步,慢慢改变,节奏虽快,心不要慌~~