JavaWeb文件的上传与下载(1)
经常用到的上传:
头像上传,资料分享等
文件上传的步骤
1、指定表单类型为文件上传表单
enctype="multipart/form-data"
2、表单提交方式必须为:post(get方式只能提交1k大小的数据)
3、表单中存在文件域表单元素
如下:
<form action="${pageContext.request.contextPath/test }" method="post" enctype="multipart/form-data" >
文件:<input type="file" name="file1" /><br>
用户名:<input type="text" name="username" /><br>
<input type="submit" value="提交" />
</form>
一、手动实现文件上传
代码如下
package com.gqx.uploadself; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 手动处理文件上传
* @author Administrator
*
*/
public class test extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
/*
* 下面的方法是通常我们用的request.getParameter()方法的原型
* 下面的方法经过解析后就是request.getParameter()方法了
*/
//request.getQueryString(); //获取GET:username=gqxing&pwd=111
//request.getInputStream();//获取POST:inputStream /*
* 现在获取的是文件数据,是post请求,只能用request.getInputStream()
*/
//获取表单(POST)数据
InputStream in=request.getInputStream();
//转为为字符流
InputStreamReader inReader=new InputStreamReader(in);
//为了读取方便,加入一个缓冲流BufferedReader(读取字符流)
BufferedReader reader=new BufferedReader(inReader);
String str=null;
while((str=reader.readLine())!=null){
System.out.println(str);
}
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
} }
之后启动服务器,提交表单和上传文件(这里是文本文件)后就会看到控制台的的输出一下内容
如果需要获取上传数据,需要对上面的结果进行解析(就是对字符串的处理),每一次上传都是这样的结构,每一次都要解析,将每一个上传项通过FileItem去封装相应的数据,但这样自己写一个解析程序,有点麻烦,同时不利于代码的后期维护,别人对你代码不太熟悉,这个时候可以使用apach提供的一个组件。
二、使用FileUpload组件(apach提供)
api说明
—DiskFileItemFactory 文件上传的工厂类(把每一个请求表单封装为一个个的FileItem对象)
setRepository(repository);设置删除临时目录(当上传文件过大的时候,会把文件写入临时文件,再从临时文件输出到指定文件中,再把临时文件清除)
—ServletFileUpload 文件上传核心类,可以获取所有的FileItem对象
isMultipartContent(request):判断文件是否是表单类型
parseRequest(request):获取所有文件上传项
setFileSizeMax(fileSizeMax); 设置上传总文件的最大值
setSizeMax(sizeMax);设置单个文件上传的最大值
setHeaderEncoding("utf-8");设置上传文件的编码格式
—FileItem 封装了普通表单项的值以及上传表单项的值
item.getFieldName(); 获取上传表单元素名称
item.getString(); 获取上传数据
item.getString("utf-8") 获取上传数据,处理中文
item.getContentType(); 获取上传文件类型【一般用于文件项】
item.getInputStream(); 获取文件流【一般用于文件项】
item.getName(); 获取文件名【一般用于文件项】
item.write(file); 写文件【一般用于文件项】
item.delete() 删除临时文件【一般用于文件项】
组件使用:
下载组件;引入jar文件(commons-fileupload-1.2.1.jar 和 commons-io-1.4.jar )
实例代码如下
package com.gqx.uploadjar; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* 文件上传组件的使用
* @author Administrator
*
*/
public class FileUpLoad extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//1、创建文件上传工厂类
FileItemFactory fac=new DiskFileItemFactory();
//2、创建文件上传的核心类对象
ServletFileUpload upload=new ServletFileUpload(fac);
//判断当前表单是否是文件上传表单
if (upload.isMultipartContent(request)) { //3、把请求数据转化为FileItem对象集合
List<FileItem> list;
try {
list = upload.parseRequest(request);
//遍历每一个上传项
for (FileItem fileItem : list) {
//判断:是普通表单项,还是文件上传表单
if (fileItem.isFormField()) {
//普通表单
String fileName=fileItem.getFieldName(); //表单元素名称
String content=fileItem.getString(); //文本框值
System.out.println(fileName+content);
}else {
//文件上传表单
String fileName=fileItem.getFieldName(); //表单元素名称
String contentType=fileItem.getContentType(); //文件类型
String name=fileItem.getName(); //文件名
InputStream in=fileItem.getInputStream(); //文件流
System.out.println(fileName+contentType+name+in);
} }
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
} }
运行结果如下:
案例:
实现一个完整的文件上传
1、设置单个文件不超过30兆
2、设置总大小不超过50兆
3、上传目录:上传到项目资源目录下的upload目录下
代码如下:
package com.gqx.uploadjar; import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* 文件上传的完整案例
* @author Administrator
*
*/
public class FileUpLoadCase extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
// 1、创建上传工厂类
DiskFileItemFactory factory=new DiskFileItemFactory();
//2、创建文件上传核心类
ServletFileUpload upload=new ServletFileUpload(factory);
//[1]设置当个文件最大:30M
upload.setFileSizeMax(30*1024*1024);
//[2]设置总文件大小不超过50M
upload.setSizeMax(50*1024*1024);
//判断是否是文件上传表单
if (upload.isMultipartContent(request)) {
//3、把请求数据转化为FileItem的集合
try {
List<FileItem> items=upload.parseRequest(request);
//遍历FileItem
for (FileItem fileItem : items) {
//判断普通表单还是文本表单
if (fileItem.isFormField()) {
//获取元素名称
String fieldName=fileItem.getFieldName();
//获取值
String value=fileItem.getString("utf-8");
System.out.println(fieldName+":"+value); }else {
//文件上传
//获取文件名
String name=fileItem.getName();
//获取文件目录
String basePath=getServletContext().getRealPath("/upload");
//创建文件对象
File file=new File(basePath,name);
fileItem.write(file);
fileItem.delete();//删除临时文件
}
} } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
} }
JavaWeb文件的上传与下载(1)的更多相关文章
- JavaWeb 文件的上传、下载
文件上传 表单 <form action="HandlerServlet" method="post" enctype="multipart/f ...
- JavaWeb中文件的上传和下载
JavaWeb中文件的上传和下载 转自: JavaWeb学习总结(五十)——文件上传和下载 - 孤傲苍狼 - 博客园https://www.cnblogs.com/xdp-gacl/p/4200090 ...
- Javaweb之文件的上传与下载
Javaweb之文件的上传与下载 一.基于表单的文件上传 如果在表单中使用表单元素 <input type=“file” />,浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可 ...
- java实现ftp文件的上传与下载
最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...
- 在SpringMVC框架下实现文件的 上传和 下载
在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8" ...
- SecureCRT使用sz和rz命令进行文件的上传和下载
SecureCRT可以使用sz和rz命令进行文件的上传和下载. sz文件下载: 格式:sz 文件名称 即可将服务器的文件下载至本地. rz文件上传: 格式:rz 文件名称 即可将本地文件上传至服务器. ...
- 使用FTPClient进行文件服务器内文件的上传和下载
我用的FTPClient是由Apache组织的commons-net.jar包中的API,这个包用起来非常的方便,很容易上手.我在项目开发的过程中主要用到了文件的上传和下载功能,下面将我开发的代码贴出 ...
- iOS开发中文件的上传和下载功能的基本实现-备用
感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...
- Apache FtpServer 实现文件的上传和下载
1 下载需要的jar包 Ftp服务器实现文件的上传和下载,主要依赖jar包为: 2 搭建ftp服务器 参考Windows 上搭建Apache FtpServer,搭建ftp服务器 3 主要代码 在ec ...
随机推荐
- float([x]): 将一个字符串或数转换为浮点数。如果无参数将返回0.0
float([x]): 将一个字符串或数转换为浮点数.如果无参数将返回0.0 >>> float(12) 12.0 >>> float(-122) -122.0 & ...
- BZOJ 3997 [TJOI 2015 组合数学] 解题报告
这个题我脑洞了一个结论: 首先,我们定义满足以下条件的路径为“从右上到左下的路径”: 对于路径上任何不相同的两个点 $(x_1, y_1)$,$(x_2, y_2)$,都有: $x_1\neq x_2 ...
- C语言中随机数的生成
刚好在找这方面的资料,看到了一片不错的,就全文转过来了,省的我以后再找找不到. 在C语言中,可以通过rand函数得到一个“伪随机数”.这个数是一个整数,其值大于等于0且小于等于RAND_MAX.ran ...
- Android+Junit单元测试1
学习参考: http://my.oschina.net/liux/blog/52469 http://mobile.51cto.com/android-229614.htm 一,权限配置 <ap ...
- push 栈顶sp=sp-2 可以把立着的栈,向左侧倒下,那么形态就和反汇编时,内存的形态是一样的。小偏移的字节在前, 大的偏移字节在后
push 栈顶sp=sp-2 可以把立着的栈,向左侧倒下,那么形态就和反汇编时,内存的形态是一样的.小偏移的字节在前, 大的偏移字节在后. 1 2 3 4 5 1 2 3 4 5
- android 业务需求: 先干掉自己, 在重启自己
// 重启应用 public void restartApp() { Intent intent = new Intent(); // 参数1:包名,参数2:程序入口的activity intent. ...
- C#博文搜集
1. abstract (抽象类) 参考1 2. interface (接口) 参考1 3. 委托 C#委托学习
- Android Integer.decode()和Intger.valueof()
decode合适用来分析数字 可以分析 8进:010=>分析后为 8 10进:10=>分析后为 10 16进:#10|0X10|0x10=>分析后是 16 而valueof 只 ...
- Hibernate的优缺点
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDB ...
- Visual Studio 那些隐藏的调试功能(转)
原文出处: 微软互联网开发支持 Visual Studio 是一个强大的调试工具,里面很多隐藏功能少有人问津,但是在特定场景可以节省你很多时间,本文主要介绍一些Visual Studio调试相关 ...