A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 隔壁小白 于 2017-12-28 21:33 编辑

#文件上传
*文件上传概述
*文件上传:
指的是将本地的文件写到服务器上.
*文件上传技术
Servlet3.0:注解开发,文件上传,异步请求
JSPSmartUpload:嵌入到JSP中完成文件上传,主要用于Mode年代的.
FileUpload:Apache的文件上传组件.
Struts2:底层是FileUpload.
*文件上传的要素:
表单的提交方式必须是POST.(POST没有大小限制)
表单中需要有文件上传的表单元素:这个元素必须有name属性和值:<input type=”file name=upload>
表单的enctype属性的值必须是multipart/form-data.
加上注解:@multipartConfig
*Servlet3.0
* Servlet3.0Servlet2.5提供了三个新特性:
* 注解开发 :方便
* 文件上传 :有些API不是特别全.
* 异步请求
*Servlet3.0的注解开发
*@WebServlet
* @WebListener
* @WebFilter
*文件上传原理分析
*设计文件上传的页面:
进行文件上传的抓包分析:
没有设置enctype属性的时候:只能获得文件的名称,而没有文件内容.
设置enctype属性为multipart/form-data:获得到文件名及文件内容.


*代码实现:
【步骤一】:设置一个文件上传页面.
【步骤二】:点击提交,提交到Servlet.
【步骤三】:在Servlet中接收参数.
【步骤四】:获得服务器的文件上传的路径.
【步骤五】:通过流写到该路径下就OK.
代码:
@WebServlet("/UploadServlet")
@MultipartConfig
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 接收普通数据:
request.setCharacterEncoding("UTF-8");
String filedesc = request.getParameter("filedesc");
System.out.println("文件描述"+filedesc);
// 接收文件:
Part part = request.getPart("upload");
long size = part.getSize();// 获得文件大小:
System.out.println("文件大小:"+size);
String name = part.getName();
System.out.println("文件表单中的name属性的名称"+name);
// 获得文件名:
String header = part.getHeader("Content-Disposition");
int idx = header.lastIndexOf("filename=\"");
String fileName = header.substring(idx+10, header.length()-1);
System.out.println("文件名:"+fileName);
// 获得文件内容:
InputStream is = part.getInputStream();
// 获得upload的路径:
String path = this.getServletContext().getRealPath("/upload");
OutputStream os = new FileOutputStream(path+"/"+fileName);
byte[] b = new byte[1024];
int len = 0;
while((len = is.read(b))!=-1){
os.write(b, 0, len);
}
is.close();
os.close();
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
*文件上传问题:文件名重名.
使用随机的唯一文件名:
* 使用UUID作为随机的文件名.
*文件上传问题:一个目录下存放的文件过多.
一个目录下文件过多,导致打开都很慢,更别说是读写操作.
目录分离:
* 按时间分 :一个月一个目录,一个星期一个目录,一天一个目录
* 按数量分 :一个目录下存5000个文件,创建一个新的目录,再去存放.
* 按用户分 :为每个用户创建一个单独目录 存放文件.
* 按目录分离算法分 :
    * 使用唯一文件名.hashCode(); -- 得到一个代表当前这个文件的int类型值.
    * int类型占4个字节32.可以让hashCode&0xf; 得到一个int,用这个int值作为一级目录.
    * hashCode右移4&0xf ;得到一个int,用这个int值作为二级目录.依次类推.
*计算机中的算法
因为计算机中是二进制,二进制没有负数,人为规定,数组的第一位是符号位,如果第一位是0,则表示,这个数是整数,如果第一位是1,则这个数表示是负数.
+7:0000 0111
-7:1000 0111
这种编码,在计算机中被称为:源码

为了解决+7加-7不等于0的问题,所以人为规定,计算机不能使用"源码"来计算,而是要使用"反码".
反码:
证书的反码是正数本身,负数的反码是"负数的云阿妈除了符号位之外,其他位取反(0变1,1变0)
补码:
*System.out.println(100);
0b100:二进制
0100:八进制
0x100:十六进制



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马