jsp
----------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
controller
----------------------------------------------------------------------------------------------------
@Controller
@RequestMapping("/")
public class UploadShipSoft {
@Value("#{propertiesReader['sys.shipsoft.filepath']}")
private String uploadPath;
@RequestMapping(value = "/upload.do", method = RequestMethod.POST)
public void uploadFile(HttpServletRequest req,HttpServletResponse resp, MultipartFile file, String version){
Map map = new HashMap();
if(file != null){
//获取实际路径,“/”指代项目根目录,所以代码返回的是项目在容器中的实际发布运行的根路径
String path = req.getSession().getServletContext().getRealPath("/");
//获取文件的名字以及格式
map.put("filename", file.getOriginalFilename());
//获取文件的大小
map.put("size", file.getSize() / (1024.0 * 1024) + "M");
try {
//获得相对路径
String filePath = File.separatorChar+uploadPath+File.separatorChar+file.getOriginalFilename();
//进行文件的保存,function附下
//从InputStream中读出内存到byte[]中然后,使用FileOutputStream写入文件中.
FileUtil.SaveFileFromInputStream(file.getInputStream(), path+filePath);
BoatsVersion boatsVersion = new BoatsVersion();
boatsVersion.setCreateTime(new Date());
boatsVersion.setVersion(version);
boatsVersion.setDomain("http://58.49.94.100/njszhd");
boatsVersion.setAddress(filePath);
resp.setCharacterEncoding("utf-8");
if(boatsVersionService.save(boatsVersion)){
//redirect 会首先发一个response给浏览器, 然后浏览器收到这个response后再发一个requeset给服务器, 然后
//服务器发新的response给浏览器. 这时页面收到的request是一个新从浏览器发来的. 跳转到一个新的页面
resp.sendRedirect("load.jsp?save=succes");
}else{
resp.sendRedirect("load.jsp?save=error"); }
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
-------------------------------------------------
public static void SaveFileFromInputStream(InputStream stream,String filename) throws IOException
{
//获取文件名第一个字符的位置
int index = filename.lastIndexOf(File.separatorChar);
//截取当前文件所在目录路径
String path = filename.substring(0,index + 1);
File file=new File(path);
//file.exists():测试此抽象路径名定义的文件或目录是否存在
//file.isDirectory():java中的isDirectory()是检查一个对象是否是文件夹。返回值是boolean类型的。如果是则返回true,否则返回false。
if(!file .exists() || !file.isDirectory()){
//mkdirs()创建此抽象路径指定的目录,包括所有必须但不存在的父目录。(及可以创建多级目录,无论是否存在父目录)
file.mkdirs();
}
File saveFile = new File(filename);
if(!saveFile .exists())
//如果指定的文件不存在,创建该文件
saveFile.createNewFile();
//这将创建一个文件输出流写入到由指定的File对象表示文件。
FileOutputStream fs = new FileOutputStream(filename);
byte[] buffer =new byte[1024*1024];//存储读取数据的缓冲区
int bytesum = 0;
int byteread = 0;
//stream.read(buffer):从此输入流中将 byte.length 个字节的数据读入一个 byte 数组中。在某些输入可用之前,此方法将阻塞。
此方法只执行 read(b, 0, b.length) 调用并返回结果。注意到它不 执行 in.read(b) 很重要;FilterInputStream 的某些子类依赖于实际使用的实现策略。
//读入缓冲区的字节总数,如果因为已经到达流末尾而没有更多的数据,则返回 -1
while ((byteread=stream.read(buffer))!=-1)
{
bytesum+=byteread;
//buffer:存储读取数据的缓冲区
// 0:目标数组 b 中的起始偏移量
// byyrtread:读取的最大字节数
fs.write(buffer,0,byteread);
fs.flush();
}
fs.close();
stream.close();
}