一、 文件上传

1、本质就是I/O读写

  • 客户端(浏览器)发送文件,发送的是http协议。文件的内容写出去,客户端本地使用输入流,然后将内容用网络输出流输出。
  • 服务器(web容器)接收文件,用网络输入流把文件的内容读过来,然后服务器本地输出流读取。

2、可以使用别人写好的包进行文件上传,常用的是Apache组织提供的一个包。
commons-fileupload.jar commons-io.jar去官方网站下载:www.apache.org,下拉至最下面,点击commons,选择下载fileupload,io

3、上传的步骤:
浏览器端:

1)写一个jsp/html做展示(选择某一个文件)
2)必须通过表单提交
3)必须使用post方式
规定:ServletFileUpload类中一个属性 post
字节数:get没有限制,肯定通过URL拼串儿
每一个不同浏览器对于URL处理长度有所不同
IE 2048+35 IE 4076
Google 8182 FireFox 65535
Safari 80000 Opera 190000
post没有限制,需要web容器的支持,跟容器的处理性能有关。
比如Tomcat,没有限制,可以通过配置文件。
server.xml <Connector port="8080" maxPostSize="0">
4)以前的表单只有两个属性 action method=“post”
如果想要做文件上传 表单中必须再添加一个属性
enctype="multipart/form-date"
5)必须使用<input type="file">通过这个组件让用户选择上传的文件,不仅仅能得到文件名,将文件的内容读出来。

服务器端:

1)引入文件上传需要的jar包。
commons-fileupload-1.4.jar
commons-io-2.6.jar
2)使用一个DiskFileItemFactory对象
DiskFileItemFactory factory = new DiskFileItemFactory();
使用一个ServletFileUpload对象,包含一个factory
ServletFileUpload upload = new ServletFileUpload(factory);
使用upload对象解析request ,得到一个List<FileItem>
List<FileItem> itemList = upload.parseRequest(request);
3.自己的业务逻辑
通过遍历集合可以获取每一个item元素,
FileItem item 元素可能是一个普通组件,可能是一个文件
item.isFormField();方法可以判断是否是一个普通文件
如果item是一个普通的组件
注意:不能用原生的方式获取参数request.getParameter();
使用如下方式获取
String = item.getFieldName();获取组件的name属性
String = item.getString();获取组件的value属性
注意:不能使用原生的方式处理中文request.setCharacterEncoding();
使用如下方式处理:item.getString("UTF-8");
如果item判断后是一个文件:
先读取文件的内容:item.getInputStream();
然后将文件用输出流写出:item.write(File file);
4.如果上传的文件较大,可能会报错。因而需要产生临时文件,为了防止丢包。
默认情况下存在tomcat的temp文件夹中。
以下的两种方法可以设置缓冲区大小以及位置:
factory.setSizeThreshold(1024000);//设置缓冲区大小,默认大小为10240
factory.setRpository(new File("路径"));//设置缓冲区位置
还可以设置上传本身的大小:
upload.setFileSizeMax();//限制单个上传文件大小
upload.setSizeMax();//限制上传文件的总大小

举个小例子:

//index.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>$Title$</title></head><body><form action="saveFile" method="post" enctype="multipart/form-data">请输入名字:<input type="text" name="username" value=""><br>请选择文件:<input type="file" name="filename" value=""><br><input type="submit" value="确定"></form></body>
</html>
  // 配置信息<servlet><servlet-name>servlet</servlet-name><servlet-class>controller.Upload</servlet-class></servlet><servlet-mapping><servlet-name>servlet</servlet-name><url-pattern>/saveFile</url-pattern></servlet-mapping>
//服务器的上传
package controller;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class Upload extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {try {//创建一个工厂DiskFileItemFactory factory = new DiskFileItemFactory();//创建ServletFileUpload文件上传ServletFileUpload upload = new ServletFileUpload(factory);//通过upload解析request对象//实现上传文件的监督upload.setProgressListener(new ProgressListener() {@Overridepublic void update(long l, long l1, int i) {//第一个参数表示 已经上传的字节个数,一般以4096个字节查看一下//第二个参数表示 上传文件的总字节数//第三个参数表示 正在上传的第几个组件System.out.println("正在上传第"+i+"个组件,已经上传"+((((double)l/(double)l1)*100))+"%");try{Thread.sleep(300);}catch (Exception e){e.printStackTrace();}}});List<FileItem> items = upload.parseRequest(request);//将items中所有的item元素遍历for (FileItem item : items){if (item.isFormField()){//判断是普通的组件String key = item.getFieldName(); //获取key/nameString value = item.getString();//获取valueSystem.out.println(key+"---"+value);}else {//表示文件String key = item.getFieldName();//接收文件的keyString realFileName = item.getName();//接收文件的真实名字//处理中文名乱码的问题item.getString("UTF-8");request.setCharacterEncoding("UTF-8");System.out.println(key+"--"+realFileName);//如何获取根目录?//this.getServletContext().getRealPath("/");//获取一个输入流,读取网络传递过来的文件内容//InputStream inputStream = item.getInputStream();item.write(new File("D://test/"+realFileName));//将文件的内容写在D盘里面}}} catch (Exception e) {e.printStackTrace();}}//设计一个方法,限制上传类型private boolean testFileType(String fileName){String[] box ={"txt","doc","pdf","jpg","png"};//循环遍历数组for (int i=0 ; i<box.length ; i++){if (fileName.endsWith(box[i])){return true;}}return false;}}

总结
文件上传需要注意的事情:

1、浏览器端需要满足的条件:form表单、post请求、enctype属性、file组件(多个)。
2、服务器端需要满足的条件:factory工厂对象、upload对象,解析request方法、list<Filelt>
3、上传文件保存的路径:放在一个固定的位置比如D://test,可移植性不好。放在当前工程的根目录下:String path = this.getServletContext().getRealPath("/");//根目录
4、最好限制一下文件上传的大小:单个、总体、缓冲区。
5、如果文件上传出现文件名冲突的问题?怎么解决?
(1)原来的名字+用户+时间.原来的后缀
比如:1_zzt_date.jpg
(2)用一个随机产生的名字当做保存在服务器中的文件名。
比如:1.jpg—>xxx.jpg
6、有些时候可能上传的文件需要控制类型。
可以自己设计一个方法。

比如:

private boolean testFileType(String fileName){String[] box ={"txt","doc","pdf","jpg","png"};//循环遍历数组for (int i=0 ; i<box.length ; i++){if (fileName.endsWith(box[i])){return true;}}return false;}

4.上传文件知识的补充
实现上传的同时监督一下进度:
upload对象

//实现上传文件的监督upload.setProgressListener(new ProgressListener() {@Overridepublic void update(long l, long l1, int i) {//第一个参数表示 已经上传的字节个数,一般以4096个字节查看一下//第二个参数表示 上传文件的总字节数//第三个参数表示 正在上传的第几个组件System.out.println("正在上传第"+i+"个组件,已经上传"+((((double)l/(double)l1)*100))+"%");try{Thread.sleep(300);}catch (Exception e){e.printStackTrace();}}});

二、文件下载(举小例子说明)

1、浏览器端
需要有个下载按钮。
比如:

<a href="download?fileName=xxx.txt">下载</a>

2、服务器端
1.获取传递过来的文件名字
2.找到该文件,并且读取该文件。
3.如果文件名中含有中文,处理一下字符集
4.设置响应的内容类型。
5.将内容响应回浏览器。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.获取传递过来的文件名字String fileName = request.getParameter("fileName");//2.找到该文件并读取该内容InputStream inputStream = new FileInputStream("D://test/"+fileName);//3.如果含有中文,就处理一下字符集fileName = URLEncoder.encode(fileName,"UTF-8");//4.设置响应的contentType内容类型response.setContentType("application/x-msdownload");response.setHeader("Content-disposition","attachment;filename="+fileName);//5.将内容响应回浏览器OutputStream outputStream = response.getOutputStream();byte[] b = new byte[1024];int length = inputStream.read(b);while (length != -1){outputStream.write(b,0,length);outputStream.flush();length = inputStream.read();}}

留言:欢迎各位小伙伴们的评论哈 ~

JavaEE_文件上传、文件下载相关推荐

  1. Spring MVC 文件上传 文件下载

    索引: 目录索引 参看代码 GitHub: pom.xml WebConfig.java index.jsp upload.jsp FileUploadController.java Files_Ut ...

  2. [WebApi]WebApi通过接口上传文件-单文件 多文件上传 文件下载

    WebApi通过接口上传文件 单文件上传(ajax,Form表单都适用) 1.html 2.javascript 3.C# Form表单之单文件上传 1.html 2.javascript 3.C# ...

  3. Jmeter接口测试-文件上传/文件下载

    目录 1.前言 2.文件上传 3.文件下载 1.前言 对于大多数被测接口的请求方式,使用Jmeter是完全可以的,但是类似文件上传与下载的接口请求方式,使用起来没有在Postman上方便,需要一些特殊 ...

  4. CI框架文件上传+多文件上传+文件下载

    代码中的logMessage()和Directory()是自己封装的记录日志和递归创建文件夹助手函数 注意修改!!! 点击查看:Directory()    logMessage() <?php ...

  5. php 多文件上传与下载,php实现文件下载跟多文件上传

    php实现文件下载和多文件上传 文件下载: html: 文件上传: html代码:请选择您要上传的文件: 请选择您要上传的文件: 请选择您要上传的文件: 请选择您要上传的文件: 请选择您要上传的文件: ...

  6. hadoop HDFS的文件夹创建、文件上传、文件下载、文件夹删除,文件更名、文件详细信息、文件类型判断(文件夹或者文件)

    摘要: 本篇文章主要介绍的是hadoop hdfs的基础api的使用.包括Windows端依赖配置,Maven依赖配置.最后就是进行实际的操作,包括:获取远程hadoop hdfs连接,并对其进行的一 ...

  7. 【struts2】文件上传下载—struts2实现

    struts2实现上传下载时要用到的jar包: UploadAction.java(fileupload.action) package com.rczp.action;import java.io. ...

  8. SpringBoot实现文件单文件上传、批量上传、下载

    一.搭建一个SpringBoot框架 没有搭建的小伙伴,先去搭建一个 SpringBoot框架快速入门搭建Hello Worldhttps://blog.csdn.net/KangYouWei6/ar ...

  9. Servlet笔记十(文件上传和下载)

    本栏博客目录 Serlvet笔记一(Servlet基础) Servlet笔记二(请求和响应) Servlet笔记三(会话及其会话技术) Servlet笔记四(JSP技术) Servlet笔记五(EL表 ...

最新文章

  1. 25 岁“天才少年”曹原再发一篇 Nature!9 个月的第三篇 Nature!
  2. 五个指标看BCH,它距离“币圈金本位”还有多远?
  3. win10前面板耳机没声音
  4. 机器人从计算机应用领域看,人的素质差异,本质地不在于他们即存知识信息量的差异,而在于他们思维能力的差异。( )...
  5. python抓取网站访客手机号_点击了一个教育网站,马上就有老师打电话过来,他们是怎么获取我的手机号?...
  6. java static调用吗_Java中的static的使用
  7. oracle fnd file.log,OracleEBSWIP模块DebugLog收集方法
  8. 在ASP.NET Core 3.1 MVC中集成Vue.js V4和使用Dropzone文件上传
  9. encapsulation
  10. 与吴恩达并肩战斗,她是颜值爆表的 AI 科学家!
  11. 系统技巧之如何巧妙的整理磁盘碎片
  12. 1、CSS Float(浮动),2、CSS 布局 - 水平 垂直对齐,3、CSS 伪类(Pseudo-classes),4、导航栏
  13. css权威指南_CSS指南
  14. python把英语句子成分字母_英语句子成分分析(最完整版)
  15. wps页眉怎么设置不同页码_wps页眉的页码和页脚的页码不同怎么设置?
  16. 浅析export * from 与 export {default} from用法
  17. 两个鸡蛋测试:从100层楼往下扔鸡蛋,求最坏情况下确认保证鸡蛋可以不破的最大楼层所需次数
  18. 强推Markdown神器,一秒钟拯救微信公众号排版
  19. 阿里云域名证书免费认证教程
  20. java from space to space_快速定位Java 内存OOM的问题

热门文章

  1. JavaWeb-新版
  2. web服务器的网站选项,Web服务器配置方法(2)
  3. 12.6 运动模糊
  4. vs2013 连接 海马玩模拟器
  5. 如何添加TFS团队成员权限
  6. 如何制作易拉宝【设计小白篇】
  7. 最小生成树算法——普里姆算法
  8. 图文详解Linux的IO模型和相关技术
  9. 【题解】【AcWing】1609. 前序和后序遍历
  10. 三种方法部署YUM软件仓库