经常用到的上传:

  头像上传,资料分享等

文件上传的步骤

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)的更多相关文章

  1. JavaWeb 文件的上传、下载

    文件上传 表单 <form action="HandlerServlet" method="post" enctype="multipart/f ...

  2. JavaWeb中文件的上传和下载

    JavaWeb中文件的上传和下载 转自: JavaWeb学习总结(五十)——文件上传和下载 - 孤傲苍狼 - 博客园https://www.cnblogs.com/xdp-gacl/p/4200090 ...

  3. Javaweb之文件的上传与下载

    Javaweb之文件的上传与下载 一.基于表单的文件上传 如果在表单中使用表单元素 <input type=“file” />,浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可 ...

  4. java实现ftp文件的上传与下载

    最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...

  5. 在SpringMVC框架下实现文件的 上传和 下载

    在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8" ...

  6. SecureCRT使用sz和rz命令进行文件的上传和下载

    SecureCRT可以使用sz和rz命令进行文件的上传和下载. sz文件下载: 格式:sz 文件名称 即可将服务器的文件下载至本地. rz文件上传: 格式:rz 文件名称 即可将本地文件上传至服务器. ...

  7. 使用FTPClient进行文件服务器内文件的上传和下载

    我用的FTPClient是由Apache组织的commons-net.jar包中的API,这个包用起来非常的方便,很容易上手.我在项目开发的过程中主要用到了文件的上传和下载功能,下面将我开发的代码贴出 ...

  8. iOS开发中文件的上传和下载功能的基本实现-备用

    感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...

  9. Apache FtpServer 实现文件的上传和下载

    1 下载需要的jar包 Ftp服务器实现文件的上传和下载,主要依赖jar包为: 2 搭建ftp服务器 参考Windows 上搭建Apache FtpServer,搭建ftp服务器 3 主要代码 在ec ...

随机推荐

  1. float([x]): 将一个字符串或数转换为浮点数。如果无参数将返回0.0

    float([x]): 将一个字符串或数转换为浮点数.如果无参数将返回0.0 >>> float(12) 12.0 >>> float(-122) -122.0 & ...

  2. BZOJ 3997 [TJOI 2015 组合数学] 解题报告

    这个题我脑洞了一个结论: 首先,我们定义满足以下条件的路径为“从右上到左下的路径”: 对于路径上任何不相同的两个点 $(x_1, y_1)$,$(x_2, y_2)$,都有: $x_1\neq x_2 ...

  3. C语言中随机数的生成

    刚好在找这方面的资料,看到了一片不错的,就全文转过来了,省的我以后再找找不到. 在C语言中,可以通过rand函数得到一个“伪随机数”.这个数是一个整数,其值大于等于0且小于等于RAND_MAX.ran ...

  4. Android+Junit单元测试1

    学习参考: http://my.oschina.net/liux/blog/52469 http://mobile.51cto.com/android-229614.htm 一,权限配置 <ap ...

  5. push 栈顶sp=sp-2 可以把立着的栈,向左侧倒下,那么形态就和反汇编时,内存的形态是一样的。小偏移的字节在前, 大的偏移字节在后

    push  栈顶sp=sp-2 可以把立着的栈,向左侧倒下,那么形态就和反汇编时,内存的形态是一样的.小偏移的字节在前, 大的偏移字节在后. 1 2 3 4 5 1 2 3 4 5

  6. android 业务需求: 先干掉自己, 在重启自己

    // 重启应用 public void restartApp() { Intent intent = new Intent(); // 参数1:包名,参数2:程序入口的activity intent. ...

  7. C#博文搜集

    1. abstract (抽象类) 参考1 2. interface (接口) 参考1 3. 委托 C#委托学习

  8. Android Integer.decode()和Intger.valueof()

    decode合适用来分析数字 可以分析 8进:010=>分析后为 8 10进:10=>分析后为 10 16进:#10|0X10|0x10=>分析后是 16 而valueof    只 ...

  9. Hibernate的优缺点

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDB ...

  10. Visual Studio 那些隐藏的调试功能(转)

    原文出处:  微软互联网开发支持   Visual Studio 是一个强大的调试工具,里面很多隐藏功能少有人问津,但是在特定场景可以节省你很多时间,本文主要介绍一些Visual Studio调试相关 ...