java中文件上传_java文件上传

文件上传

1.1文件上传概述

​ 就是将客户端的数据发送到服务器上的操作

1.2文件上传要求

1.2.1浏览器端要求(通用浏览器的要求)

表单提交方式 post

提供文件上传框(组件) input type="file"

表单的entype属性必须为 multipart/form-data

1.2.2服务器端要求

​ 要使用request.getInputStream()来获取数据.

注意:

​ 若表单使用了 multipart/form-data ,使用原生request.getParameter()去获取参数的时候都为null

1.3常见的文件上传框架

​ commons-fileupload

​ struts2(底层:commons-fileupload)

​ serlvet3.0

​ ...

1.4commons-fileupload的使用

​ apache出品的一款专门处理文件上传的工具类

​ 使用步骤:

导入jar包8619580.html

创建磁盘文件项工厂

DiskFileItemFactory factory=new DiskFileItemFactory();

创建核心上传对象

ServletFileUpload upload=new ServletFileUpload(factory);

解析请求,获取所有的上传组件 List

List list=upload.parseRequest(request);

遍历list 获取每一个上传项

FileItem的API:

​ getFiledName():获取标签里面name属性的值

​ isFormFiled():判断是否是普通上传组件;

​ true:普通上传组件,不是File text,password,hidden....

​ false:文件上传组件 是File

普通上传组件, 不是File

getString("utf-8"):获取(普通上传组件)用户输入的内容

文件上传组件 是File

getName():获取文件名称

getInputStream():获取文件的流(文件内容)

delete():删除文件上传时候产生的临时文件

Eg:

1 protected void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {2

3 try{4 //创建磁盘文件项工厂

5 DiskFileItemFactory factory = newDiskFileItemFactory();6 //创建核心上传对象

7 ServletFileUpload fileUpload = newServletFileUpload(factory);8 //获得所有的上传组件

9 List list =fileUpload.parseRequest(request);10 for(FileItem fileItem : list) {11 //获得标签的name属性值

12 System.out.println(fileItem.getFieldName());13 //判断是否是文件上传

14 if(fileItem.isFormField()){15 //普通上传组件16 //获得普通上传组件的内容

17 System.out.println(fileItem.getString("utf-8"));18

19 }else{20 //文件上传组件21 //获得文件上传组件的输入流

22 InputStream is =fileItem.getInputStream();23

24 //创建文件输出流

25 OutputStream os= new FileOutputStream("G:/1.txt");26

27 IOUtils.copy(is, os);28

29 os.close();30 }31

32 }33

34 } catch(Exception e) {35 e.printStackTrace();36 }37 }

1.5上传注意问题

文件重名问题

给文件取一个随机名称, uuid方式 或者 毫秒值++三个随机数

文件名称问题 目的是获得文件真实名字,不带盘符的

如果是IE:文件名带盘符E:/data/Desktop/a.txt

其它的火狐,谷歌是文件本来的名字: a.txt

浏览器不同,有可能获取的名称不同(IE是带盘符的), 1.txt 或者 G:\1.txt

常见的目录分离

按用户划分

按时间划分

按数量划分

随机划分 算法:

1 /**

2 * 获取文件目录,可以获取256个随机目录3 *@return随机目录 /a/c4 */

5 public staticString getDir(){6 String s="0123456789ABCDEF";//16个

7 Random r = newRandom();8 return "/"+s.charAt(r.nextInt(16))+"/"+s.charAt(r.nextInt(16));9 }

三,思路分析

在left.jsp上添加一个连接,"添加商品",点击,在主页面上打开一个表单页面

.../adminProductServlet?method=addUI创建addUI()方法

​ 调用业务,获得所有的分类List

​ 把List存到request,转发到 /admin/product/add.jsp

在add.jsp页面,点击确定按钮,把数据提交到服务器

//请求的Servlet还能继承BaseServlet??? 不可以 因为BaseServlet依赖requet.getParamet("method")获得方法名

//把每一个表单子标签设置name属性

创建AddProductServlet ,在doGet()方法里面:

​ //封装成Product, 调用业务,最终保存到数据库

​ //保存图片文件到服务器

创建Service

创建Dao

四,代码实现

WEB层(AddProductServlet)

1 public class AddProductServlet extendsHttpServlet {2 private static final long serialVersionUID = 1L;3 protected void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {4 try{5 //1.创建磁盘文件项工厂

6 DiskFileItemFactory factory = newDiskFileItemFactory();7 //2.创建核心上传对象

8 ServletFileUpload upload = newServletFileUpload(factory);9 //3.解析请求,获得文件项集合

10 List list =upload.parseRequest(request);11

12 Map map = new HashMap();13 //4.遍历文件项集合

14 for(FileItem fileItem : list) {15 //4.1获得表单里面name的值,(name的值应该和javaBean的属性是一致)

16 String fieldName =fileItem.getFieldName();17 //4.2 判断是否是file

18 if(fileItem.isFormField()){19 //不是file20 //a.获得value的值

21 String value = fileItem.getString("utf-8");22 map.put(fieldName, value);23

24 }else{25 //是file26 //a.获得文件名

27 String fileName =fileItem.getName();28 //b.获得真实的文件名

29 fileName =UploadUtils.getRealName(fileName);30 //c.获得随机文件名

31 String uuidName =UploadUtils.getUUIDName(fileName);32 //d.获得一个随机目录名 /a/b/c

33 String dir =UploadUtils.getDir();34 //e.存到map里面 products/1/c_0001.jpg

35 map.put(fieldName, "products"+dir+"/"+uuidName);36 //f:把文件保存在服务器

37 String realPath = getServletContext().getRealPath("/products");38 File fileDir = newFile(realPath, dir);39 if(!fileDir.exists()){40 fileDir.mkdirs();41 }42

43 OutputStream os = new FileOutputStream(newFile(fileDir, uuidName));44 //获得输入流

45 InputStream is =fileItem.getInputStream();46 IOUtils.copy(is, os);47 //删除临时文件

48 fileItem.delete();49 //关闭流

50 IOUtils.closeQuietly(is);51 IOUtils.closeQuietly(os);52 }53 }54

55 //5.封装product对象

56 Product product = newProduct();57 //5.1 使用beanutils封装

58 BeanUtils.populate(product, map);59 //5.2手动封装pid,pdate,pflag

60 product.setPid(UUIDUtils.getId());61 product.setPdate(newDate());62 product.setPflag(Constant.PRODUCT_IS_UP);63 //5.3手动设置 category

64 Category c = newCategory();65 c.setCid((String)map.get("cid"));66 product.setCategory(c);67

68 ProductService productService = (ProductService) BeanFactory.getBean("ProductService");69 System.out.println(product.toString());70

71 productService.save(product);72

73 response.sendRedirect(request.getContextPath()+"/adminProductServlet?method=findAll");74

75 } catch(Exception e) {76 e.printStackTrace();77 }78 }79 ​80 protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {81 doGet(request, response);82 }83 ​84 }

快捷键:

快速查找页面或者Java类

8619580.html

查看继承关系

8619580.html

查看当前类的结构(方法)

8619580.html

封装:

WEB(Servlet): 表单里面/前端页面获得数据比较多,通常在WEB层封装,传给Service

Dao: 是从数据库获得, 通过只封装和数据库语句对应的数据(JavaBean,List), 传给Service

Service: 补充WEB层传过来的,传给Dao; 补充Dao 传过来的,传给WEB (eg:PageBean)

JavaBean: 如果当前javaBean需要封装逻辑,定义方法; 通常的话是一张表对应一个JavaBean

---恢复内容结束---

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值