评论

收藏

[Java] Java文件上传与文件下载实现方法详解

编程语言 编程语言 发布于:2021-09-18 17:08 | 阅读数:249 | 评论:0

这篇文章主要介绍了Java文件上传与文件下载实现方法,结合实例形式详细分析了Java文件上传与文件下载相关操作原理、实现方法及相关操作注意事项,需要的朋友可以参考下
本文实例讲述了java文件上传与文件下载实现方法。分享给大家供大家参考,具体如下:
java文件上传
数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传。文件上传是数据上传的一种特例,指客户端向服务器上传文件。即将保存在客户端的文件上传一个副本到服务器,并保存在服务器中。
1、上传表单要求

  • 文件上传要求客户端提交特殊的请求——multipart请求,即包含多部分数据的请求。必须将<form/>标签的enctype属性值设为“multipart/form-data”,enctype表示encodingtype,及编码类型
  • 由于客户端上传文件的大小是不确定的,所以http协议规定,文件上传的数据要存放于请求正文中,不能出现在url地址栏内。也就是说,想要上传文件必须提交post请求。
  • 表单中要有<input type="file" />标签
  • 注意:multipart/form-data请求与普通请求不同
2、下载文件上传jar包并查看官方文档
打开apache官网http://www.apache.org/,选择apache project list中的commons
DSC0000.png

选择commons中的fileupload项目,并下载jar包和源文件
DSC0001.jpg

DSC0002.jpg

查看fileupload的工作方式
DSC0003.jpg

查看fileupload项目的api
DSC0004.jpg

3、使用第三方jar包上传文件
public class registerservlet extends httpservlet {
  private static final long serialversionuid = 1l;
  public registerservlet() {
  super();
  }
  protected void doget(httpservletrequest request, httpservletresponse response)
  throws servletexception, ioexception {
  response.getwriter().append("served at: ").append(request.getcontextpath());
  }
  protected void dopost(httpservletrequest request, httpservletresponse response)
  throws servletexception, ioexception {
  //第一步、判断请求是否为multipart请求
  if(!servletfileupload.ismultipartcontent(request)) {
    throw new runtimeexception("当前请求只支持文件上传");
  }
  try {
    //第二步、创建fileitem工厂
    diskfileitemfactory factory = new diskfileitemfactory();
    //设置临时文件存储目录
    string path = this.getservletcontext().getrealpath("/temp");
    file temp = new file(path);
    factory.setrepository(temp);
    //单位:字节。本例设置边界值为2mb,超过该值会创建临时文件
    factory.setsizethreshold(1024*1024*2);
    //第三步、创建文件上传核心组件
    servletfileupload upload = new servletfileupload(factory);
    //设置item的头部字符编码,解决中文乱码问题
    upload.setheaderencoding("utf-8");
    //设置单个上传文件的最大值为5mb
    upload.setfilesizemax(1024*1024*5);
    //设置一次上传所有文件总和的最大值为10mb(上传多个文件时起作用)
    upload.setfilesizemax(1024*1024*10);
    //第四步、解析请求获取所有的item
    list<fileitem> items = upload.parserequest(request);
    //第五步、遍历item
    for(fileitem item:items) {
    if (item.isformfield()) {
      processformfield(item);
      } else {
      processuploadedfile(item);
      }
    }
  } catch (fileuploadexception e) {
    e.printstacktrace();
  }
  }
  private void processformfield(fileitem item) {
  try {
    string name = item.getfieldname();
    //解决中文乱码问题
    string value = item.getstring("utf-8");
    system.out.println(name+"="+value);
  } catch (unsupportedencodingexception e) {
    e.printstacktrace();
  }
  }
  private void processuploadedfile(fileitem item) {
  try {
    inputstream inputstream = item.getinputstream();
    string fieldname = item.getfieldname();
    //获取上传文件原始名称
    string filename = item.getname();
    //解决文件同名问题
    filename = system.currenttimemillis()+filename;
    string contenttype = item.getcontenttype();
    boolean isinmemory = item.isinmemory();
    long sizeinbytes = item.getsize();
    string path = this.getservletcontext().getrealpath("/uploadcontent");
    //date now = new date();
    calendar now = calendar.getinstance();
    //对上传的文件进行分类管理
    path += "/"+now.get(calendar.year)+"/"+(now.get(calendar.month)+1)+"/"+now.get(calendar.day_of_month);
    //若目录不存在,则创建该目录
    file directory = new file(path);
    if(!directory.exists()) {
    directory.mkdirs();
    }
    file descfile = new file(path,filename);
    outputstream outputstream = new fileoutputstream(descfile);
    int length = -1;
    byte[] buffer = new byte[1024];
    while((length=inputstream.read(buffer))!=-1) {
    outputstream.write(buffer, 0, length);
    }
    outputstream.close();
    inputstream.close();
    //删除临时文件
    item.delete();
  } catch (ioexception e) {
    e.printstacktrace();
  }
  }
}
java文件下载
数据下载是客户端从服务器获取数据,服务器向客户端发送的所有响应都属于数据下载。文件下载是数据下载的一种特例,指客户端从服务器下载文件,即将保存在服务器的文件下载一个副本到客户端。通常我们对服务器所发出的请求,大多是文件下载请求,从服务器中下载文本、图片、声音、视频等文件,客户端浏览器对这些文件进行解析后,我们才能看到多媒体信息。
1、超链接下载

  • 浏览器能解析的文件会直接显示,如:pdf、jpg......
  • 浏览器解析不了的文件会被另存为,如:rar、exe......
  • 浏览器版本不一样,对文件的解析能力也不同
  • 缺点:下载内容的形式(直接显示/另存为)由浏览器决定,跟服务器无关
2、servlet方式下载

  • 设置响应头部属性content-disposition值为attachment
  • 获取连接服务器源文件的输入流
  • 获取输出流
  • 将输入流中的数据写到输出流中
public class downloadservlet extends httpservlet {
  private static final long serialversionuid = 1l;
  public downloadservlet() {
  super();
  }
  protected void doget(httpservletrequest request, httpservletresponse response)
  throws servletexception, ioexception {
  //设置响应的头部属性content-disposition值为attachment
  //使用filename来指定文件名
  string filename = "超跑.png";
  byte[] bytes = filename.getbytes("utf-8");
  //http协议规定浏览器只能接受iso8859-1类型的字节数据
  filename = new string(bytes,"iso8859-1");
  response.setheader("content-disposition", "attachment;filename="+filename);
  //获取连接服务器资源文件的输入流
  inputstream is = request.getservletcontext().getresourceasstream("/resources/bs架构原理图1.png");
  //获取输出流
  servletoutputstream os = response.getoutputstream();
  //将输入流中的数据写到输出流中
  int length = -1;
  byte[] buffer = new byte[1024];
  while((length=is.read(buffer))!=-1) {
    os.write(buffer,0,length);
  }
  os.close();
  is.close();
  }
  protected void dopost(httpservletrequest request, httpservletresponse response)
  throws servletexception, ioexception {
  doget(request, response);
  }
}
希望本文所述对大家java程序设计有所帮助。
原文链接:https://blog.csdn.net/xiaouncle/article/details/80379322

关注下面的标签,发现更多相似文章