文件的上传和下载,是非常常见的功能。很多的系统中,或者软件中都经常使用文件的上传和下载。 比如:QQ 头像,就使用了上传。 邮箱中也有附件的上传和下载功能。 OA 系统中审批有附件材料的上传。
1.文件的上传介绍(重点)
- 要有一个 form 标签,method=post 请求
- form 标签的 encType 属性值必须为 multipart/form-data 值
- 在 form 标签中使用 input type=file 添加上传的文件
- 编写服务器代码(这里使用Servlet 程序)接收,处理上传的数据。
encType=multipart/form-data 表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼 接,然后以二进制流的形式发送给服务器。
upload.jsp:
<body>
<form action="http://172.25.11.14:8080/09_EL_JSTL/uploadServlet" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username" /> <br>
头像:<input type="file" name="photo" /> <br>
<input type="submit" value="上传" />
</form>
</body>
之后再写一个 UploadServlet.java(重写doPost方法) , 配置访问地址为 uploadServlet(这里全部省略)。
1.1 文件上传,HTTP 协议的说明

Content-Type 表示提交的数据类型
multipart/form-data 表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器。
boundary 表示每段数据的分隔符
----WebKitFormBoundaryfR6ijBPPqbdkIBkO是由浏览器每次都随机生成。它就是每段数据的分隔符。
下面以服务器不以流的形式接收为例:
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//以流的形式发给服务器,则只能以流的形式接收
//以不是流的形式接收为例
System.out.println(req.getParameter("username"));
System.out.println(req.getParameter("photo"));
}
在浏览器上传过文件之后,在idea的控制台输出了两个 null 。
下面以流的形式接收数据为例:
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletInputStream inputStream = req.getInputStream();
//需要创建一个buff缓冲区
byte[] buffer = new byte[1024000];
int read = inputStream.read(buffer);
System.out.println(new String(buffer,0,read)); //从0开始读了 read 个
}

本文详细介绍了JavaWeb中文件上传下载的实现,包括HTTP协议的multipart/form-data形式,使用commons-fileupload.jar处理上传,以及解决文件名乱码问题的方案,如URLEncoder和BASE64编码。
最低0.47元/天 解锁文章
416

被折叠的 条评论
为什么被折叠?



