在jsp页面中
文件上传:
<!-- enctype表示多功能表单 -->
<form action="${pageContext.request.contextPath}/file/up.action" method="post" enctype="multipart/form-data">
头像:<input type="file" name="myfile"/>
<input type="submit"/>
</form>
<img src="${pageContext.request.contextPath}${imgsrc}">
<br/>
文件下载
<a href="${pageContext.request.contextPath}/file/down.action?fileName=111.jpg">下载111.jpg</a>
spring.xml文件中需要如下配置:(5242880表示的是5M的大小)
<!-- 文件上传解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
创建一个文件上传的类如下:
package com.zy.controller;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.junit.Test;
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 org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/file")
public class FileController {
//辅助方法
//1根据逻辑路径得到真实路径
@SuppressWarnings("deprecation") //逻辑路径
public String myGetRealPath(String path,HttpServletRequest request){
String realPath = request.getRealPath(path);
System.out.println("真实路径:"+realPath);
File file = new File(realPath);
if(!file.exists()){//如果不存在就创建一个
file.mkdirs();
}
return realPath;
}
//2更改文件名
public String newFileName(MultipartFile file){//参数是文件对象
String originalFilename = file.getOriginalFilename();
//abc.jpg
//截取后缀,拼接新的文件名
//后缀
String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
//新文件名要求:上传中-防止文件名重复,发生覆盖
String uu = UUID.randomUUID().toString();
String newName=uu+substring;
return newName;
}
//上传--//如果controller只需要跳转页面的话,可以把返回值写成String
@SuppressWarnings("resource")
@RequestMapping("/up")
public String up(MultipartFile myfile,HttpServletRequest request) throws Exception{
//得到真实路径
String path="/img";//逻辑路径
String myGetRealPath = myGetRealPath(path, request);
//得到新的文件名
String newFileName = newFileName(myfile);
//上传本质---把本地文件按流的方式copy到服务上
//输入流
InputStream inputStream = myfile.getInputStream();
//输出流
FileOutputStream fileOutputStream = new FileOutputStream(myGetRealPath+"/"+newFileName);
//copy
IOUtils.copy(inputStream, fileOutputStream); //结束
//关闭资源
inputStream.close();
fileOutputStream.close();
//回显图片
request.setAttribute("imgsrc", path+"/"+newFileName);
return "/index.jsp";
}
//图片下载
@RequestMapping("/down")
public void down(HttpServletResponse response,String fileName,HttpServletRequest request) throws IOException {
//设置头---- 下载和预览的区别,下载需要加上attachment
response.setHeader("Content-Disposition", "attachment;fileName="+fileName);
//下载的本质--文件按流的方式用服务器copy到本地
//得到资源在服务器的真实路径
String path = "/aaa/" + fileName;
String myGetRealPath = myGetRealPath(path, request);
//创建输入流
FileInputStream fileInputStream = new FileInputStream(myGetRealPath);
//输出流
ServletOutputStream outputStream = response.getOutputStream();
IOUtils.copy(fileInputStream, outputStream);
//关闭资源
fileInputStream.close();
outputStream.close();
}
}