引言
时隔一天,上一篇文章《文件存储》刚一停笔,今天上午就解决了困扰我已久的文件上传问题。
站在一个已实现功能的角度来重新看待这个文件上传的业务:编辑页面选择jar包,然后通过form表单提交,上传到后台程序,然后保存。
对于后端实现的更多细节,可以参考我的另一篇技术分享《Java实现用户头像上传》,里面较为详细的分析了文件从浏览器传输到服务器之后的一些处理规则,包括接收方式、磁盘存储等。
文件上传的入口
最简单的浏览器上传入口仅需要一个form标签:
<form action="http://localhost:8081/thingsparse/addorupdthingsparse" method="post" enctype="multipart/form-data">
<input type="file" name="file" value="选择jar包"/>
<input id="submit_form" type="submit" class="btn btn-success save" value="保存"/>
</form>
前端只是用了传统的form表单上传文件的方式,提交按钮直接submit到后台,而不需要多写哪怕一丁点的额外js。
值得注意的是:每条form表单参数都需要有name属性,以及form表单的enctype="multipart/form-data"。
文件的存储
其实关键的代码就是文件的接收,至于后面的存储操作,基本上都是对IO流的操作。浏览《Java实现用户头像上传》参考更多信息。
/**
* 解析新建编辑
*
* @param String
* newThingsParse是一个拥有ThingsParse类结构的json字符串
* @return
*/
@RequestMapping(value = "/addorupdthingsparse")
public ModelAndView saveThingsParse(MultipartFile file, HttpServletRequest request) {
String idStr = request.getParameter("thingsparse_id");
ThingsParse thingParse = new ThingsParse();//将被存储于mongodb的实例
String filePath = "";// jar包的路径
if (!file.isEmpty()) {
File temp = new File("");
filePath = temp.getAbsolutePath() + "\\" + file.getOriginalFilename();
BufferedOutputStream out;
try {
out = new BufferedOutputStream(new FileOutputStream(new File(filePath)));
out.write(file.getBytes());
out.flush();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
logger.info("保存的jar包路径是:" + filePath);//output:保存的jar包路径是:D:\workspace\wxgz\json.jar
thingParse.setJarPackage(filePath);
thingParse.setAuthor(request.getParameter("author"));
thingParse.setDirection(request.getParameter("direction"));
thingParse.setEntranceClass(request.getParameter("entrance_class"));
thingParse.setEntranceMethod(request.getParameter("entrance_method"));
thingParse.setName(request.getParameter("thingsparse_name"));
thingParse.setTestData(request.getParameter("test_data"));
thingParse.setVersion(request.getParameter("version"));
if (idStr == null || "".equals(idStr)) {// 新增
// 获取当前系统时间
Calendar now = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowStr = sdf.format(now.getTime());
// 将物解析实例的创建时间赋值
thingParse.setCreateTime(nowStr);
// 存储
thingsParseRepository.save(thingParse);
} else {// 编辑
thingParse.set_id(new ObjectId(idStr));
if(file.isEmpty()){
thingParse.setJarPackage(request.getParameter("jar_package"));
}
thingParse.setCreateTime(request.getParameter("thingsparse_createtime"));
thingsParseRepository.save(thingParse);
}
String listUrl = "redirect:http://localhost:8081/thingsparse/thingsparselist";
return new ModelAndView(listUrl);//后台重定向
}
总结
web应用的文件上传是一个相对通用的功能,使用最简单的form表单提交基本可以满足多数应用的要求。
关键的思路就是前端的form表单选择文件然后提交,后端使用类型MultipartFile 接收。而文件保存到本地磁盘可以参考《文件存储》和《Java实现用户头像上传》。