21、文件上传/下载

一、文件的上传和下载

要将客户端(浏览器)大数据存储到服务器端,不将数据直接存储到数据库中,而是要将数据存储到服务器所在的磁盘上(减少了数据库服务器的压力,对数据的操作更加灵活)

1、文件上传的原理

1.1 文件上传的必要前提:

(1)提供form表单,method必须是post

(2)form表单的enctype(编码类型)必须是 multipart/form-data

(3)提供input type="file"类的上传输入域

${pageContext.request.contextPath }:绝对路径

1.2 enctype属性

告知服务器请求正文的MIME(文件类型)类型。(请求消息头:Content-Type作用是一致的)

可选值:

application/x-www-form-urlencoded(默认):

正文:name=admin&password=123

服务器获取数据:String name = request.getParameter("name");

multipart/form-data:

正文

服务器获取数据: request.getParameter(String)方法获取指定的表单字段字符内容,但文件上传表单已经不在是字符内容,而是字节内容,所以失效。

文件上传本质:解析请求正文的每部分的内容

2、借助第三方的上传组件实现文件上传

2.1 fileupload概述

fileupload是由apache的commons组件提供的上传组件。它最主要的工作就是帮我们解析request.getInputStream()

导入commons-fileupload相关jar包

(1)commons-fileupload.jar,核心包

(2)commons-io.jar,依赖包

2.2 fileupload的核心类有:

DiskFileItemFactory、ServletFileUpload、FileItem

解析原理

2.3 fileupload简单应用

使用fileupload组件的步骤如下:

(1)创建工厂类DiskFileItemFactory对象

DiskFileItemFactory factory = new DiskFileItemFactory()

(2)使用工厂创建解析器对象

ServletFileUpload fileUpload = new ServletFileUpload(factory)

(3)使用解析器来解析request对象

List<FileItem> list = fileUpload.parseRequest(request)

FileItem对象

对应一个表单项(表单字段),可以是文件字段或普通字段

boolean isFormField():判断当前表单字段是否为普通文本字段,如果返回false,说明是文件字段;

String getFieldName():获取字段名称,例如:<input type=”text” name=”username”/>,返回的是username;

String getString():获取字段的内容,如果是文件字段,那么获取的是文件内容,当然上传的文件必须是文本文件;

String getName():获取文件字段的文件名称;(a.txt)

String getContentType():获取上传的文件的MIME类型,例如:text/plain。

int getSize():获取上传文件的大小;

InputStream getInputStream():获取上传文件对应的输入流;

void write(File):把上传的文件保存到指定文件中。

delete();

3、文件上传时要考虑的几个问题

(1)保证服务器的安全

把保存上传文件的目录放在用户直接访问不到的地方。

(2)避免文件被覆盖

让文件名唯一即可

(3)避免同一个文件夹中的文件过多

方案一:按照日期进行打散存储目录

方案二:用文件名的hashCode计算打散的存储目录:二级目录

(4)限制文件的大小:web方式不适合上传大的文件

单个文件大小:

ServletFileUpload.setFileSizeMax(字节)

总文件大小:(多文件上传)

ServletFileUpload.setSizeMax(字节)

(5)上传字段用户没有上传的问题

通过判断文件名是否为空即可

(6)临时文件的问题

DiskFileItemFactory:

作用:产生FileItem对象

内部有一个缓存,缓存大小默认是10Kb。如果上传的文件超过10Kb,用磁盘作为缓存。

存放缓存文件的目录在哪里?默认是系统的临时目录。

如果自己用IO流实现的文件上传,要在流关闭后,清理临时文件。

FileItem.delete();

4、文件的下载

时间: 2024-10-03 22:51:24

21、文件上传/下载的相关文章

java web 文件上传下载

文件上传下载案例: 首先是此案例工程的目录结构: 处理上传: FileUploadServlet.java 1 package fnz.fileUploadTest; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.PrintWriter; 7 import java.text.SimpleDateFormat; 8 import java.

Hadoop之HDFS原理及文件上传下载源码分析(下)

上篇Hadoop之HDFS原理及文件上传下载源码分析(上)楼主主要介绍了hdfs原理及FileSystem的初始化源码解析, Client如何与NameNode建立RPC通信.本篇将继续介绍hdfs文件上传.下载源解析. 文件上传 先上文件上传的方法调用过程时序图: 其主要执行过程: FileSystem初始化,Client拿到NameNodeRpcServer代理对象,建立与NameNode的RPC通信(楼主上篇已经介绍过了) 调用FileSystem的create()方法,由于实现类为Dis

.Net Core 图片文件上传下载

当下.Net Core项目可是如雨后春笋一般发展起来,作为.Net大军中的一员,我热忱地拥抱了.Net Core并且积极使用其进行业务的开发,我们先介绍下.Net Core项目下实现文件上传下载接口. 一.开发环境 毋庸置疑,宇宙第一IDE VisualStudio 2017 二.项目结构 FilesController 文件上传下载控制器 PictureController 图片上传下载控制器 Return_Helper_DG 返回值帮助类 三.关键代码 1.首先我们来看Startup.cs

SpringMVC文件上传下载

在Spring MVC的基础框架搭建起来后,我们测试了spring mvc中的返回值类型,如果你还没有搭建好springmvc的架构请参考博文->http://www.cnblogs.com/qixiaoyizhan/p/5819392.html 今天我们来讲讲spring mvc中的文件上传和下载的几种方法. 首先附上文件目录->我们需要配置的我做了记号-> 一.文件上传 首先为了方便后续的操作,以及精简代码,我们在Utils包下封装一个文件上传下载的帮助类: Files_Helper

【FTP】FTP文件上传下载-支持断点续传

Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常用)]和[ASCII_FILE_TYPE]两种; 数据连接模式:一般使用LocalPassiveMode模式,因为大部分客户端都在防火墙后面: 1. LocalPassiveMode:服务器端打开数据端口,进行数据传输: 2. LocalActiveMode:客户端打开数据端口,进行数据传输: 系统

Selenium2学习-039-WebUI自动化实战实例-文件上传下载

通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a或其他方式结合实现). 非input标签类因其有各式各样的实现方式,需要考虑具体的场景,因而此文对此类文件上传不做讲解,以input标签实现文件上传的方式进行讲解,请知悉! 解决方案有如下三种: 1.定位元素直接通过sendkeys修改input标签的文件链接: 2.通过第三方控件(AutoIt)编

salesforce 零基础学习(四十二)简单文件上传下载

项目中,常常需要用到文件的上传和下载,上传和下载功能实际上是对Document对象进行insert和查询操作.本篇演示简单的文件上传和下载,理论上文件上传后应该将ID作为操作表的字段存储,这里只演示文件上传到Document对象中. 一.文件上传功能 apex代码 1 public with sharing class FileUploadUsedTransientController { 2 3 public transient Blob fileUploadBody{get;set;} 4

Retrofit2文件上传下载及其进度显示

序 前面一篇文章介绍了Retrofit2的基本使用,这篇文章接着介绍使用Retrofit2实现文件上传和文件下载,以及上传下载过程中如何实现进度的显示. 文件上传 定义接口 1 2 3 @Multipart @POST("fileService") Call<User> uploadFile(@Part MultipartBody.Part file); 构造请求体上传 1 2 3 4 5 File file = new File(filePath); RequestBod

JavaWeb实现文件上传下载功能实例解析

转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件

HttpClient文件上传下载

1 HTTP HTTP 协议可能是如今 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序须要直接通过 HTTP 协议来訪问网络资源. 尽管在 JDK 的 java.net 包中已经提供了訪问 HTTP 协议的基本功能,可是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活.HttpClient 用来提供高效的.最新的.功能丰富的支持 HTTP 协议的client编程工具包,而且它支持 HTTP 协议最新的版本号和建议. 一般的情况下我们都是使用Chro