文件上传心得

servlet的图片上传心得小结

1.图片上传用到的相关jar包
链接:https://pan.baidu.com/s/1vtUoylDmbcmBCesLuIqGnQ
提取码:g412
2.上传图片的思想
将本地文件上传到服务器,并对其进行保存,存到数据库,前提必须使用post传参和multipart/form-data格式,但是在使用了该格式下时,以前的request.getParameter(String name);并不能获取客户端传送来的参数,只能采用第三方jar**(servletupload)来实现(在servlet阶段)
3.具体实现
3.1.前端实现
首先图片上传利用到的是form表单,默认情况下
Content-Type:application/x-www-form-urlencoded**,但并不支持文件的上传,此时我们手动的在form表单上加上enctype="multipart/form-data"

multipart/form-data:不对字符编码,在使用包含文件上传控件的表单时,必须使用该值。对于multipart/form-fata类型的表单,浏览器上传的实体内容中的每个表单字段元素的数据之间,
用字段分割线进行分割,两个分割界线间的内容成为一个分区,每个分区的内容可以被看做两部分,
一部分是对表单元字段元素进行描述的描述头

//multiple该属性支持多文件上传

3.2后端实现
       导入jar包后,我们会想,既然request无法获取客户端传递来的参数,那么此时我们要如何拿到我们想要的参数呢。
       其实这时只是无法通过request获取了而已,但参数依然还是会随着request传递到服务端。我们只需要依赖第三方jar包获取即可。具体实现如下:
a、先将HttpServletRequest中的参数转化为一个列表,这时我们要用到FileUpload或者是其的子类ServletFileUpload对象,但此时需要在其构造方法中传入一个参数FileItemFactory对象或其子类对象。代码如下

FileUpload fu = new FileUpload(new DiskFileItemFactory());

b、将request对象进行转化,FileUpload对象的parseRequest(Request s)方法,返回一个List<>列表(泛型FileItem),之后进行循环遍历每一个对象,通过对象调用getFieldName()获取属性名,getString()获取属性值。
c、之后我们将上传的文件路径保存到数据库,将真实文件保存项目相关的硬盘里。
首先服务端可以获得项目所在磁盘的正真目录

getServletContext().getRealPath("/")//举例:
//F:\web20190918\out\artifacts\web20190918_war_exploded\

之后通过FileUpload对象可以获得文件的名称及后缀,这时我们可以在F:\web20190918\out\artifacts\web20190918_war_exploded\目录下创建一个文件夹用来保存文件。实现如下

File file = new File(path + filename);
 fileItem.write(file);//fileItem是遍历上述list列表的对象。

这样就完成了图片的上传与保存。

注意:
1.在项目根目录下创建的子文件夹不能为空,否则无法上传
2.区分file与普通的表单元素的方法:FileItem 对象的方法isFormField(),该方法
会对普通表单元素进行判断,并返回true;

3.若是普通的表单调用getString()方法可以获取它值,而要是file的话,要调用getName()方法,才能获取上传文件的名称
fileItem.isFormField()//若返回true是除了file以外的表单元素

4.乱码问题
伤处文件时,传统意义上的设置客户端传来的中文乱码并不能起作用(request.setCharacterEncoding(“utf-8”)),此时要先以iso-8859-1解码,然后再以utf-8进行编码成新的字符串
String value = new String(fileItem.getString().getBytes(“ISO-8859-1”),“utf-8”);

目的:为了拿到图片(二进制码)的名称进行保存操作。
小技巧:将拿到的数据封装称一个实体对象

Map maps; 要求map的key与实体类的属性名相同
Student s=new Student();
BeanUtils.populate(s,maps);

你可能感兴趣的:(servlet,jsp,servlet)