好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 LWGQAQ 于 2019-11-12 20:22 编辑
大家好,欢迎你来到【每日易学】,我是最招人烦的大盆老师。今天我来手把手教你如何用servlet写文件上传(针对正在学习Javaweb童鞋,非喜勿喷)
首先要准备文件上传的基础工作
(1)jar包准备工作:commons-io-1.1.jar 和 commons-fileupload-1.1.jar!!!(重点)
没有的小伙伴也不要着急,网站如下
http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
http://commons.apache.org/proper/commons-io/download_io.cgi
(2)将from表单提交方式post
(3)在表单上加上这个属性 enctype="multipart/form-data"。
multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。需要注意的是:默认情况下,enctype的值是application/x-www-form-urlencoded,不能用于文件上传,只有使用了multipart/form-data,才能完整的传递文件数据。application/x-www-form-urlencoded不是不能上传文件,是只能上传文本格式的文件,multipart/form-data是将文件以二进制的形式上传,这样可以实现多种类型的文件上传。
(4)代码说明展示如下dopost调用doget public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//目的:收集表单的数据 封装一个Product实体 将上传图片存到服务器磁盘
Commodity c = new Commodity(); //收集数据的容器
Map<String,Object> map = new HashMap<String,Object>();
try { //创建磁盘文件项工厂 DiskFileItemFactory factory = new DiskFileItemFactory();
//创建文件上传核心对象
ServletFileUpload upload = new ServletFileUpload(factory);
//解析request获得文件项对象集合
List<FileItem> parseRequest = upload.parseRequest(request); for(FileItem item : parseRequest){
//判断是否是普通表单项
boolean formField = item.isFormField(); if(formField){
//普通表单项 获得表单的数据 封装到Product实体中 String fieldName = item.getFieldName(); String fieldValue = item.getString("UTF-8");
map.put(fieldName, fieldValue);
}else{ String path = "E:/Java/Workspaces/OnlineManagerMedialMall/WebRoot/pic"; String pathShop = "E:/Java/Workspaces/ManagerOnlineShop/WebRoot/pic";
String pathTomCat = "C:/Users/Lenovo/Desktop/apache-tomcat-7.0.79/webapps/OnlineManagerMedialMall/pic";
String pathShopTocat = "C:/Users/Lenovo/Desktop/apache-tomcat-7.0.79/webapps/ManagerOnlineShop/pic";
//文件上传项 获得文件名称 获得文件的内容
String fileName = item.getName(); //String paths = this.getServletContext().getRealPath("pic");
InputStream in = item.getInputStream(); OutputStream out = new FileOutputStream(path+"/"+fileName);//I:/xxx/xx/xxx/xxx.jpg
IOUtils.copy(in, out);
in.close();
out.close();
item.delete(); this.copyImage(path,pathTomCat,fileName); this.copyImage(path,pathShop,fileName); this.copyImage(path,pathShopTocat,fileName); map.put("commodity_pic", "pic/"+fileName); }}BeanUtils.populate(c, map);
//是否product对象封装数据完全
//private String pid;
//将product传递给service层
this.toAddCommodity(c);
} catch (Exception e) { e.printStackTrace();
}
} | 文件上传成功(成功指的是文件上传到Tomcat服务器下的项目里,并不是真正的项目里,有的童鞋想到了,做文件拷贝工作就可以了,回答没毛病,但是单纯的拷贝工作是无意义的,真正的图片上传工作就是我们要把文件的地址存到我们数据库中)
表单提交过去的是多表单,这么才能帮助我们自动填充实体--对应数据库里的字段呢?
还记得io.jar,在Apache Commons项目下。我们可以借助API里的方法beanUtils().populate(a,b) 注明:a代表实体 b是对应map集合。实例类必须和数据库中的字段一一对应,否则添加失败。到这里上传工作已完成。在这之前同学们千万别忘记文件拷贝工作(拷贝的是我们真正项目下的路径,将文件加载到项目里)。
谢谢大家的观看!学习java是看起来简单敲起来难,记住大盆老师一句话多写 > 多看。java人加油
记得为大盆老师点个赞呗 |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|