JavaEE:文件上传与下载笔记

时间:2021-09-05 17:10:07
路径知识点:
/为正斜杠:
表示url地址,访问web地址时用正,例如:http://localhost:8080,response.sendRedirector("/user/a.html");
\为反斜杠:
表示真实本地路径,例如:c:\windows;
在java流中要用“\\”,第一个为转义符,第二个为真正的反斜杠,例如:new FileOutputStream("c:\\");

小知识点:
Runtime.getRuntime().exec("windows命令");  //获得java虚拟机所在环境,运行windows命令
windows命令:
关机:
shundown -s  执行
shundown -a  取消
format c:/q   //快速格式化

小知识点:
不用第三方变量互换两个数字(利用异或实现):
x = x^y;
y = x^y;   //一个数x异或另一数y,得到的是数y
x = x^y;   //一个数x异或另一数y两次,得到的是数x本身

文件上传
一.html页面中的代码:

<!-- 文件上传时,type属性要设为file,而且必须设置name属性,表单的属性必须设置enctype属性为multipart/form-data -->
<form action="servlet文件路径" enctype="multipart/form-data" method="post">
    <input type="file" name="传递名">      //上传选项
    <input type="submit" value="上传">     //提交按钮
</form>

二.servlet文件代码:
//如果表单类型为multipart/form-data时,表单在提交时采用Mime协议对数据封装后提交,在服务器这边要采用流技术取得文件,
(1)采用apache开发的文件上传组件实现上传,存入硬盘目录中:
     1.导入两个jar包:commons-fileupload-1.2.1.jar,commons-io-1.4.jar

     2.写上传代码:
           {
                //创建 FileItem 对象的工厂
                DiskFileItemFactory factory = new DiskFileItemFactory();
                //设置内存缓冲区的大小,默认值为10K,可不设置
                factory.setSizeThreshold(1024*100);   
                //得到上传时要用的临时目录,可不设置
                String temppath = this.getServletContext().getRealPath("/WEB-INF/temp");
                //设置临时文件的目录,可不设置
factory.setRepository(new File(temppath));
                //将表单中每个输入项封装到一个 FileItem 对象中
ServletFileUpload upload = new ServletFileUpload(factory);
                 //设置上传文件名称编码格式,可解决乱码问题,提交表单要与这里的编码一样,可不设置
upload.setHeaderEncoding("UTF-8");
//判断提交表单的类型是否为multipart/form-data
if(!upload.isMultipartContent(request)){
return;
}
try {
List list = upload.parseRequest(request);   //得到上传过来的一组文件或数据,返回List集合        
                        //对List集合中的数据进行遍历,取出每一个进行判断
Iterator it = list.iterator();
while(it.hasNext()){
FileItem item = (FileItem) it.next();      //取出表单的每个input项,FileItem类代表一个input项,
if(item.isFormField()){                    //判断input是否为普通表单输入项,如果是就按取普通形式获取数据
String name = item.getFieldName(); //取出input的名称
String value = item.getString();   //取出input的值
}else{                                     //如果是文件上传输入项
                                        InputStream in = null;
OutputStream writer = null;
                                        try{
                                           //得到上传文件名,对文件名进行截取,丢掉前面路径部分
  String filename = item.getName();  
  int pos = filename.lastIndexOf("\\");
  if(pos!=-1){
  filename = filename.substring(pos+1);
  }
  //得到上传文件要写入的目录,将目录放在WEB-INF中,可保护服务器安全,外界无法访问
  String path = this.getServletContext().getRealPath("/WEB-INF/upload");
                                           //生成唯一的文件名和文件保存的路径
          filename = generatePath(path,filename);
  //根据目录和文件名创建输出流
  writer = new FileOutputStream(filename);
  //得到提交上来文件的输入流,并写入到服务器目录中
  in = item.getInputStream();
  byte buffer[] = new byte[1024];
  int len = 0;
  while((len=in.read(buffer))>0){
writer.write(buffer,0,len);
  }
                                        }finally{
                                            //结尾操作要放在这里执行,以确保必须执行
                                            in.close();
                           out.close();
                                            item.delete();  //删除临时缓存文件
                                        }
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
            }

        3.利用算法生成多个目录,解决一个目录下文件过多的问题
            public static String generatePath(String path,String filename){
                //生成一个uuid值
String uuid = UUID.randomUUID().toString();
//根据uuid值生成子目录,生成算法用hash目录生成算法
//dir1  32位
       int dir1 = uuid.hashCode() & 0xf;  //
       int dir2 = (uuid.hashCode()>>4) & 0xf;   //

String dir = path + "\\" + dir1 + "\\" + dir2 + "\\"; 
//在硬盘中创建目录
File f = new File(dir);
                //判断目录是否已经存在
       if(!f.exists()){
//f.mkdir();   //千万小心,这里要生多级目录,调mkdir()是不行的
f.mkdirs();    //生成多级目录
}
                //对文件名加入uuid,避免上传文件名相同时原文件被覆盖的情况
       filename = uuid + "_" + filename;  
       return dir + filename;   //返回目录名+文件名组合后的名称
   }


        4.利用javascript实现多文件上传:
            <script type="text/javascript">
                function add(){
                    var file = document.getElementById("file");
                    var div = document.getElementById("div");
                    document.createElement()
                }
            </script>

        5.显示上传进度条
             upload.setProgressListener(new ProgressListener()){
                 public void update(long pBytesRead, long pContentLength, int pItems) {   //pBytesRead为已上传,pContentLength为总大小
                System.out.println("到现在为止,  " + pBytesRead + " 字节已上传,总大小为 "+ pContentLength);
        }
             }


(2)将上传文件的信息,存入数据库中:
1.建一个类UpFile用于存放文件信息

2.建立工具类JdbcUtil,连接数据库

3.建一个用操作将数据库与实体类的Dao接口

4.建立一个实现Dao接口的类,操作数据库与实体类