传统form表单提交方式的文件上传与文件存储

引言

时隔一天,上一篇文章《文件存储》刚一停笔,今天上午就解决了困扰我已久的文件上传问题。

站在一个已实现功能的角度来重新看待这个文件上传的业务:编辑页面选择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实现用户头像上传》。

  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值