经常用到的上传:

  头像上传,资料分享等

文件上传的步骤

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. css3创建动画

    @keyframes ico{ 0% { top: -100%; } 100%{ top:4%; } } @-webkit-keyframes ico{ 0% { top: -100%; } 100% ...

  2. java this 隐式参数

    第37级 this 是隐式参数, 类的方法调用时,会系统自动传递一个this的参数给方法.(这个参数是隐式传递的) 所以在方法里可以使用this这个参数. this在方法中表示对象. this(参数列 ...

  3. HTML控件ID和NAME属性的区别,以及如何在asp.net页面的.CS文件中获得.ASPX页面中HTML控件的值

    在html中:name指的是用户名称,ID指的是用户注册是系统自动分配给用户的一个序列号. name是用来提交数据的,提供给表单用,可以重复: id则针对文档操作时候用,不能重复.如:document ...

  4. [topcoder]SmartWordToy

    广度搜索BFS,要用Queue.还不是很熟,这道题帮助理清一些思绪了.其实这道题是求最短路径,所以BFS遇到第一个就可以返回了,所以后面有些现有大小和历史大小的判断可以省却. 过程中拿数组存step还 ...

  5. SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-008-带参数的ADVICE

    一. 假设有情形如:cd里有很多轨,当播放音乐时,要统计每个音轨的播放次数,这些统计操作不应放在播放方法里,因为统计不是播放音乐的主要职责,这种情况适合应用AOP. 二. 1. package sou ...

  6. QString内部仍采用UTF-16存储数据且不会改变(一共10种不同情况下的编码)

    出处:https://blog.qt.io/cn/2012/05/16/source-code-must-be-utf-8-and-qstring-wants-it/ 但是注意,这只是QT运行(Run ...

  7. Ember.js demo4

    <!DOCTYPE html> <html> <head> <meta name="description" content=" ...

  8. 关于捕获键盘信息的processDialogkey方法

    在一些控件里的keydown方法,没有办法捕获所有的按键消息 比如自己写一个窗体控件库,继承了UserControl 但是没有办法捕获一些键,比如方向键等 所以必须重载 processDialogke ...

  9. Android开发UI之自定义视图属性

    Android框架中,所有自定义的view类都继承自View,也可以继承Button等view的子类 为了允许ADT能够与view交互,必须提供一个能够获取Context和作为属性的Attribute ...

  10. windows下面虚拟主机

    1. wondows xp + apmserv 5.2.6 端口8088 2.httpd.config文件 1. ServerRoot  "D:/APMServ/APMServ5.2.6/A ...