经常用到的上传:

  头像上传,资料分享等

文件上传的步骤

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. PDF文件结构

    概述PDF是一种不依赖应用程序软件.硬件和操作系统的文件格式.PDF页包含文本.图形和图像.页面外观由内容流(content stream)描述,内容流包含一些列图形对象(graphics objec ...

  2. 调试Android USB遇到的令人费解的问题

    上周参照网上代码,做了USB的初步探测程序,工作正常 .今天从硬件部拿到了一段例程,原本打算参考它来完善自己的程序.但运行之后总是报错,逐步跟进错误,进而发现了一个匪疑所思的问题.调试一天也未发现原因 ...

  3. JAVA抽象类与接口

    在Java语言中, abstract class 和interface 是支持抽象类定 义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和in ...

  4. Android开发之AlertDialog

    http://www.cnblogs.com/Gaojiecai/archive/2011/12/10/2283156.html http://www.2cto.com/kf/201205/13187 ...

  5. scaleform 注意事项

    在使用 自带的UI .fla 里面的组建时 需要把自己建立的fla进行如下设置.  文件-发布设置-flash-脚本actionscript3.0设置——舞台:自动声明舞台实例    

  6. [HDU POJ] 逆序数

    HDU 1394 Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3276 ...

  7. apache开源项目--hadoop

    Hadoop 是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储.Hadoop实现了一个分布式文件系统(Had ...

  8. css滑动门制作圆角按钮

    之前做项目的时候,基本都是将圆角背景图切成三块,故而每次用的标签都超级多,a标签中总是包含三个span,然后里面还得放按钮,导航冗余标签极多. 事实上是之前理解的滑动门的精髓不够到位. 现在有两种方式 ...

  9. MongoDB实战开发 【零基础学习,附完整Asp.net示例】

    MongoDB实战开发 [零基础学习,附完整Asp.net示例] 阅读目录 开始 下载MongoDB,并启动它 在C#使用MongoDB 重构(简化)代码 使用MongoDB的客户端查看数据 使用Mo ...

  10. Go Hello World!

    有些事应该坚持去做 当你半途而废的时候意味着你又要重新开始.那么 Golang Hello world! Java Android 新手 学习 Golang  First Day ! go 语言下载: ...