文件上传和下载学习心得笔记+IDEA常见问题

时光毁灭记忆、已成空白 提交于 2019-12-04 14:59:38

1.如何实现文件上传
文件上传:把本地电脑的文件.上传到服务器端(服务器也需要安装到本地硬盘)。
文件上传也是通过表单传递数据的,对表单有两个要求:
1.表单必须有file输入项:
2.表单的提交方式必须是post, enctype属性必须是multipart/form-data
没有设置enctype属性值
它的默认值: application/x-Ww-form-urlencoded,提交的参数:username=wz&password=kino&filename=wz.txt
提交的数据格式: key = value,在服务器端可以使用request. getParamter的相关方法获取值。只提交了文件的名称,文件里面的数据并没有提交到后台服务器。
enctype属性设置值为multipart/ form -data,提交的数据格式:
--------------- 24248189172501
Content- Disposition: form-data; name=“username"wz
--------------- 24248189172501
Content-Disposition: form-data; name=“password"111
--------------- 24248189172501
Content -Disposition: form-data; name=“filename”; filename=” wz.txt” Content-Type: text/plain1213214464
--------------- 24248189172501–
如果想获取提交的参数,就需要apache提供commons组件下面:commons-fileupload.jar, commons-io.jar 里面提供了相关的方法来获取enctype属性为multipart/form- data提交的参数
2.文件上传的相关API
文件上传的基本步骤:
1.创建文件上传项工厂对象: DiskFileUploadFactory factory = new DiskFileUploadFactory();
2.通过工厂对象得到解析器: ServletFileUpload sf = new ServletFileUpload(factory); 3.解析请求对象,得到上传的表单项: List list = sf. parseRequest(request); list集合里面包含普通的表单项和文件上传表单项。
l.FileItem接口:
方法一: boolean f=isFormField(),如果值为true,代表是普通的表单项,否则就是文件上传项。
方法二:文件上传项的方法: String filename=getName(),表示获取文件的名称。比如由于不同的浏览器提交的不同路径
所以说获取文件名称时,有的就是文件名称a.txt,有的是c:/user/desktop/a.txt
方法三:普通表单项的方法: String name = getFieldName() , 返回的就是name属性的值,
比如<input type=“text返回的就是username。
方法四: write(File file) ,主要应用于文件.上传时,把文件保存到服务器端(服务器所安装的硬盘)
方法五: String value = getString(); 主要用于获取字符串,其实就是获取用户输入的值。
方法六: String type = getContentType(); 获取的是文件的MIME类型,比如“image/ jpeg”
方法七: boolean f = isInMemory()判断上传的文件时存在内存中,还是临时文件中。
方法八: void delete();文件. 上传完毕后删除临时文件。
方法九: InputStream in = getInputStream();获取上传文的字节输入流。
方法十: lone eetSize():获取上传文件的大小。
2.DiskFileItemFactory类
常用的方法:
1.setSizeThreshoid(int sizeThreshold)和getSizeThreshold()
set方法用来设置上传文件的临界值。
比如: setSizeThreshold(1024), 如果文件上传超出了这个1024,就启用临时文件。
2.setRepository(java.io.File repository)和getRepository()
当上传的文件大小超出了setSizeThreshold方法设置的大小,就启用临时文件,就是把上传的文件内容暂时保存在临时文件
3.ServletFileUpload类
它的作用来解析request对象,把request对 象里面封装的表单数据解析成表单项。
方法一: List list = parseRequest(request);
方法二: setSizeMax; 设置上传文件的总大小。
方法三: setFileSizeMax;设置单 个文件的大小
3.实现文件上传
步骤:
1.创建项目,导入jar包。
2.准备_上传页面: form. jsp
3.创建servlet,处理_上传的请求: UploadServlet.
4.文件下载
文件下载:从服务器端把文件保存到本地。
文件下载:一个流两个头
1.一个流:文件的字节输入流。
2.两个头(响应头)
Content- Type:对应文件的MIME类型( 可以理解为文件的扩展名)
Content-Di spostion:以下载框的方式保存文件。
5.实现文件下载
步骤:
1.创建一个下载页面:download.jsp
2.创建一个servlet,处理下载请求:DownloadServlet
6.下载文件名称为中文文件乱码问题
下载时,文件名称为中文会出现乱码问题
解决方法:
第一种:
在页面对中文进行ur1编码: <%=URLEncoder.encode(“风景.jpg”,“utf -8”)%>
在DownloadServlet进行url编码:response.addHeader(“Content-Disposition”,” attachment;filename=" +URLEncoder.encode(“风景.jpg”,“utf -8”)
它对IE浏览器乱码问题能够解决,但是对于火狐浏览器不能解决,还是乱码。
第二种:
根据浏览器的不同,去处理响应文件的中文乱码问题(见资料的DownUtils工具类)

IDEA所遇问题:

1.,服务器无报错,发布后找不到JSP页面j
一般是服务器的配置问题,

按箭头所示添加External source,删除底下箭头,原来,我这边修改后正常显示长传页面,转到Servlet还出现失败(404错误)
2.jsp页面跳转到Servlet失败(404错误)显示没有找到路径
我这里通过

原代码

 <form action="/UploadServlet" method="post" 
      enctype="multipart/form-data">

修改后

从根目录打开
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!