在工作中常碰到需要上传下载文件的需求,主要通过框架的去实现。不同的框架,在实现上有些许不同,但究其原理实际都是相同的。

Java实现上传下载原理

在页面上通过form表单提交文件,http通过流将文件传输到服务器。后台程序通过获取request中的输入流来解析出文件,然后通过outputStream保存在服务器上,这就是Java上传文件的原理。

在页面上发送请求下载文件,程序通过inputStream读取服务器上的文件,然后通过写入response的OutputStream,完成文件的下载。

以上就是对Java上传下载文件的原理简单的介绍了一下。

Java上传

在Java项目中上传文件需要使用form表单(当然也可以使用一些上传的js库),需要写出method=post和enctype=mutipart/form-data。示例如下:

form表单提交到服务器后,就能使用request.getInputStream()获取流数据,然后可以对其中的数据进行解析,使用OutputStream将文件保存在服务器上。需要注意的是,流里面的数据有一些并不是源文件的数据,需要去除。而在使用框架或者一些工具类时,可以免去这一部分的解析工作。例如在springmvc中常使用的MultipartHttpServletRequest:

MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

Map fileMap = multipartRequest.getFileMap();

接下来就只需要使用OutputStream将文件保存在服务器中就可以了。

Java下载

Java下载文件的原理很简单,就是把文件写入response的输出流中就可以了。需要注意的是要设置好response中的contentType和header,attachment表示以附件的方式下载文件,filename为文件全名。关于contentType的具体内容可以自行百度。

OutputStream os = new BufferedOutputStream(response.getOutputStream());

response.setHeader("Content-Disposition", "attachment; filename="+fileName);

response.setContentType("application/force-download");

byte[] bytes = new byte[1024];

int len = 0;

while((len = bis.read(bytes)) != -1){

os.write(bytes, 0, len);

}

bis.close();

os.flush();

os.close();

以上的代码是下载单个文件,如果需要下载多个文件,给出的建议是在服务器端将文件打包一起下载。尽量避免循环下载,而且一次连接,输出流只能输出一次。

总结

对Java的IO有基本的了解后,使用Java实现上传和下载就比较简单。重点在于对文件流的读出和写入,上传就是将request中的输入流读出保存在服务器上,下载就是将服务器上的文件写入response的输出流中。

参考

java上传下载原理_Java上传下载文件原理相关推荐

  1. java等比压缩图片_java上传并压缩图片(等比例压缩或者原尺寸压缩)

    先看效果: 原图:1.33M 处理后:27.4kb 关键代码; package codeGenerate.util; import java.awt.Color; import java.awt.Gr ...

  2. java 多线程下载图片_java多线程实现下载图片并压缩

    最近在做一个需求:从其他系统的ftp目录下载存储图片url的文件,然后读取文件中的url地址,根据地址下载图片后按天压缩成一个包,平均一个地址文件中包含4000个地址左右,也就是说一个文件扫描后需要下 ...

  3. java 多线程下载器_Java多线程的下载器(1)

    实现了一个基于Java多线程的下载器,可提供的功能有: 1. 对文件使用多线程下载,并显示每时刻的下载速度. 2. 对多个下载进行管理,包括线程调度,内存管理等. 一:单个文件下载的管理 1. 单文件 ...

  4. future java 原理_Java线程池FutureTask实现原理详解

    前言 线程池可以并发执行多个任务,有些时候,我们可能想要跟踪任务的执行结果,甚至在一定时间内,如果任务没有执行完成,我们可能还想要取消任务的执行,为了支持这一特性,ThreadPoolExecutor ...

  5. java 多线程下载 断点_Java 多线程断点下载文件

    基起原根蒂根基理:哄骗URLConnection获取要下载文件的长度.头部等相干信息,并设置响应的头部信息.并且经由过程URLConnection获取输入流,将文件分成指定的块,每一块零丁开辟一个线程 ...

  6. java中session的作用_java中session的工作原理是什么?和Cookies有何区别?

    现在大家学习的东西和以前大不相同了,越来越多的人倾向于去学习高新技术以获得更好的发展.java是很多人的第一选择.java中的知识还是很多的,今天就来为大家介绍一下. 首先来说一下java中sessi ...

  7. java 开发文档协作_Java 网络编程---分布式文件协同编辑器设计与实现

    目录: 第一部分:Java网络编程知识 (一)简单的Http请求 一般浏览网页时,使用的时Ip地址,而IP(Internet Protocol,互联网协议)目前主要是IPv4和IPv6. IP地址是一 ...

  8. java解压zip异常_java解压zip文件示例

    若是使用Java自带的压缩工具包来实现解压缩文件到指定文件夹的功能,因为jdk提供的zip只能按UTF-8格式处理,而Windows系统中文件名是以GBK方式编码的,所以如果是解压一个包含中文文件名的 ...

  9. java上传图片并生成缩略图_java 上传文件-生成文件首页缩略图 生成pdf 抓取图片...

    方法:1.文件转换成pdf(采用openoffice或者jacob) 2.抓取pdf首页图 第一步:采用jacob: a.下载jacob  注意区分32位,64位,否则不能用 将dll文件放在java ...

  10. java 传值为不可变_Java函数传参(String的不可变性)

    本篇博客无意讨论Java里面函数传参是否只有值传递还是值传递和引用传递同时存在,仅讨论函数传参的一些原理. 一. 什么是函数传参? 最常见的一个swap函数:下面这个swap函数并不能实现我们想要的交 ...

最新文章

  1. day1-数据库基础
  2. 停止Java线程,小心interrupt()方法
  3. 基于XMLHttpRequest封装Ajax请求
  4. HeadFirstJava——3_变量
  5. Matlab聚类分析相关函数
  6. 计算机论文撰写周记,电子与计算机毕业设计周记
  7. NOIP2016:换教室
  8. 列联表分析——独立性检验(卡方检验)
  9. 云部署中的 公有云 私有云 混合云 社区云 基本概念快速掌握
  10. win7休眠设置在哪里_win7系统休眠功能如何关闭 win7系统休眠功能关闭步骤【图解】...
  11. 吾生也有涯,而学也无涯
  12. UneXt 基于MLP的快速医学图像分割网络
  13. OL3中结合Jquery UI实现图层拖动并改变图层顺序
  14. 11.12. ACLs
  15. opencv获取摄像头的个数及名字
  16. 论文翻译:2022_PACDNN: A phase-aware composite deep neural network for speech enhancement
  17. 微星主板bios怎么进 微星进入bios按哪个键
  18. Initialization failed for Block pool registering (Datanode Uuid unassigned)
  19. 〖ChatGPT实践指南 - 零基础扫盲篇②〗- 深度体验 ChatGPT
  20. 纯JavaScript入门级小游戏:兔子抢金币(附演示地址+源码)

热门文章

  1. [数据挖掘笔记01] 关联规则Apriori算法
  2. 匈牙利算法(Hungarian algorithm)
  3. PowerDesigner 下载地址
  4. 建模的计算机基础理论,数学建模基础理论
  5. 关于补码与booth算法的想法与逻辑推导
  6. 机器人的弊议论文_关于练字的作文800字高中(写字机器人的利弊议论文)
  7. Android Studio实现用户登陆界面demo(xml实现)
  8. TS:虚机ipv6网络不通问题-2022.5.16(已解决-博客分享)
  9. GetWindowRect,GetClientRect,ScreenToClient MoveWindow SetWindowPos 用法说明
  10. 775针服务器cpu性能排行,775针cpu排行榜说明