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

选择Commons中的FileUpload项目,并下载jar包和源文件

查看FileUpload的工作方式

查看FileUpload项目的API

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算法相关内容感兴趣的读者可查看本站专题:《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • JavaWeb实现多文件上传及zip打包下载

    本文实例为大家分享了javaweb多文件上传及zip打包下载的具体代码,供大家参考,具体内容如下 项目中经常会使用到文件上传及下载的功能.本篇文章总结场景在JavaWeb环境下,多文件上传及批量打包下载功能,包括前台及后台部分. 首先明确一点: 无法通过页面的无刷新ajax请求,直接发下载.上传请求.上传和下载,均需要在整页请求的基础上实现.项目中一般通过构建form表单形式实现这一功能. 一.多文件上传 项目需求为实现多图片上传功能.参考测试了网上找到的众多插件方法后,决定选用Jquery原始

  • java实现文件上传下载至ftp服务器

    以前做的一个项目,用到了文件上传下载至ftp服务器,现在对其进行一下复习,比较简单,一下就能看明白. 环境:首先,先安装ftp服务器,我是在win8本地用IIS配置的, 百度一下就可以找到安装文档. 1.在你的项目目录下建立ftp配置文件,目录如下图 01 ftpconfig.properties: ftpIp=10.73.222.29 ftpPort=21 ftpUser=WP ftpPwd=04143114wp ftpRemotePath=d://share 02 读取ftpconfig.p

  • 基于Java文件输入输出流实现文件上传下载功能

    本文为大家分享了Java实现文件上传下载功能的具体代码,供大家参考,具体内容如下 前端通过form表单的enctype属性,将数据传递方式修改为二进制"流"的形式,服务端(servlet)通过  getInputStream() 获取流信息, 运用java I/O 流的基础操作将流写入到一个服务端临时创建的文件temp中,然后再次利用文件基本操作,读取并截取临时文件内容,根据其中信息创建相应的文件,将读取出来的具体信息写入,下载时,根据提交的文件名称,找到服务器端相应的文件,然后根据输

  • Java利用apache ftp工具实现文件上传下载和删除功能

    利用apache ftp工具实现文件的上传下载和删除,具体如下 1.下载相应的jar包 commons-net-1.4.1.jar 2.实现代码如下: public class FtpUtils { //ftp服务器地址 public String hostname = "192.168.1.249"; //ftp服务器端口号默认为21 public Integer port = 21 ; //ftp登录账号 public String username = "root&qu

  • java文件上传下载代码实例

    本文实例为大家分享了java文件上传下载的具体代码,供大家参考,具体内容如下 文件上传 @RequestMapping(value="/uploadFile",method=RequestMethod.POST) public ResultObject uploadFiles(@RequestParam("file")MultipartFile file,HttpServletRequest request){ ResultObject rs = null;//返回

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

    本文实例讲述了Java文件上传与文件下载实现方法.分享给大家供大家参考,具体如下: Java文件上传 数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传.文件上传是数据上传的一种特例,指客户端向服务器上传文件.即将保存在客户端的文件上传一个副本到服务器,并保存在服务器中. 1.上传表单要求 文件上传要求客户端提交特殊的请求--multipart请求,即包含多部分数据的请求.必须将<form/>标签的enctype属性值设为"multipart/form-d

  • Java实现文件上传和下载的方法详解

    目录 1.文件上传 1.1 介绍 1.2 代码实现 2.下载 2.1 介绍 2.2 代码实现 1.文件上传 1.1 介绍 文件上传,也称为upload,是指将本地图片.视频.音频等文件上传到服务器上,可以供其他用户浏览或下载的过程.文件上传在项目中应用非常广泛,我们经常发微博.发微信朋友圈都用到了文件上传功能. 文件上传时,对页面的form表单有如下要求: 表单属性 取值 说明 method post 必须选择post方式提交 enctype multipart/form-data 采用mult

  • php文件上传原理与实现方法详解

    本文实例讲述了php文件上传原理与实现方法.分享给大家供大家参考,具体如下: 文件上传实际上就是在前段使用一个form表单提交本地文件到服务器,然后在服务器端将文件从临时目录转移到指定目录的过程. 1.php配置文件 php.ini文件中的file uploads部分定义了相关文件上传配置, file_uploads = On 打开文件上传 upload_tmp_dir =临时目录 upload_max_filesize = 2M最大上传大小 max_file_uploads = 20单次最大上

  • SpringBoot文件上传与下载功能实现详解

    目录 前言 1.引入Apache Commons FileUpload组件依赖 2.设置上传文件大小限制 3.创建选择文件视图页面 4.创建控制器 5.创建文件下载视图页面 前言 文件上传与下载是Web应用开发中常用的功能之一,在实际的Web应用开发中,为了成功上传文件,必须将表单的method设置为post,并将enctype设置为multipart/form-data 只有这样设置,浏览器才能将所选文件的二进制数据发送给服务器 从Servlet3.0开始,就提供了处理文件上传的方法,但这种文

  • php安全攻防利用文件上传漏洞与绕过技巧详解

    目录 前言 文件上传漏洞的一些场景 场景一:前端js代码白名单判断.jpg|.png|.gif后缀 场景二:后端PHP代码检查Content-type字段 场景三:代码黑名单判断.asp|.aspx|.php|.jsp后缀 场景四:代码扩大黑名单判断 绕过方式--htaccsess: 绕过方式--大小写绕过: 场景五:一些复合判断 空格.点绕过(windows) ::$DATA绕过(windows) 双写绕过 %00截断 %0a绕过 图片马绕过 二次渲染绕过 条件竞争 /.绕过 前言 文件上传漏

  • Spring MVC环境中文件上传功能的实现方法详解

    前言 我们在实际开发过程中,尤其是web项目开发,文件上传和下载的需求的功能非常场景,比如说用户头像.商品图片.邮件附件等等.其实文件上传下载的本质都是通过流的形式进行读写操作,而在开发中不同的框架都会对文件上传和下载有或多或少的封装,这里就以Spring MVC环境中文件的上传为例,讲解Spirng MVC环境下的文件上传功能实现.下面话不多说了,来一起看看详细的介绍吧. 一.客户端编程 由于多数文件上传都是通过表单形式提交给后台服务器的,因此,要实现文件上传功能,就需要提供一个文件上传的表单

  • Bootstrap fileinput文件上传预览插件使用详解

    介绍 通过本文,你可以学习到如何封装或者开发一个前端组件,同时学习Bootstrap-fileinput组件的使用,封装后使用更加简单方便. BaseFile是AdminEAP框架中基于Bootstrap-fileinput的附件上传组件,它支持 支持多文件.在线预览.拖拽上传等功能,封装后BaseFile主要包括以下功能: 弹出窗口的附件上传 当前界面的附件上传 显示附件明细 可编辑的附件明细(删除.预览.不可新增) 关于Bootstrap-fileinput的API文档可参考http://p

  • PHP封装的多文件上传类实例与用法详解

    本文实例讲述了PHP封装的多文件上传类实例与用法.分享给大家供大家参考,具体如下: <?php /**//* * @(#)UploadFile.php * * 可同时处理用户多个上传文件.效验文件有效性后存储至指定目录. * 可返回上传文件的相关有用信息供其它程序使用.(如文件名.类型.大小.保存路径) * 使用方法请见本类底部(UploadFile类使用注释)信息. * */ class UploadFile { var $user_post_file = array(); //用户上传的文件

  • 微信小程序学习笔记之文件上传、下载操作图文详解

    本文实例讲述了微信小程序学习笔记之文件上传.下载操作.分享给大家供大家参考,具体如下: 前面介绍了微信小程序登录API与获取用户信息操作.这里再来介绍一下文件的上传与下载操作. [文件上传]wx.uploadFile (以上传图片为例) 后台上传接口Upload.php:(tp5) <?php namespace app\home\controller; use think\Controller; class Upload extends First { //上传图片API public fun

  • node.js express框架实现文件上传与下载功能实例详解

    本文实例讲述了node.js express框架实现文件上传与下载功能.分享给大家供大家参考,具体如下: 背景 昨天吉视传媒的客户对IPS信息发布系统又提了一个新需求,就是发布端发送消息时需要支持附件的上传,而接收端可以对发布端上传的附件进行下载:接收端回复消息时也需要支持上传附件,发布端可以对所有接收端上传的附件进行打包下载. 功能实现 前台部分 前台使用webUploader插件即可,这是百度开发的一款文件上传组件,具体使用查看它的API即可.这个项目之前开发的时候前台使用了angular.

随机推荐