经常用到的上传:

  头像上传,资料分享等

文件上传的步骤

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. BZOJ 3953 Self-Assembly 解题报告

    首先,我们可以先考虑一个暴力一点的算法: 对于任意两个分子,如果它们能以至少一种进行匹配,那么我们就在这两个分子之间连一条边. 然后如果我们能找到一个环,就说明是 unbounded,否则就是 bou ...

  2. PHP漏洞全解(二)-命令注入攻击

    本文主要介绍针对PHP网站常见的攻击方式中的命令攻击.Command Injection,即命令注入攻击,是指这样一种攻击手段,黑客通过把HTML代码输入一个输入机制(例如缺乏有效验证限制的表格域)来 ...

  3. Android中数据库Sqlite的性能优化

    1.索引简单的说,索引就像书本的目录,目录可以快速找到所在页数,数据库中索引可以帮助快速找到数据,而不用全表扫描,合适的索引可以大大提高数据库查询的效率.(1). 优点大大加快了数据库检索的速度,包括 ...

  4. memcached远程 telnet 无法连接,解决方案

    因为默认的Memcached配置,使用了本机ip:127.0.0.1 ,此时利用VI修改下配置 vi /etc/memcached.conf 文件打开后,修改下,把-l前面加入#号注释掉,重启服务器就 ...

  5. Android 自定义seekbar中,thumb被覆盖掉一部分问题

    (图一)  (图二)    (图三) 做一个自定义的seekbar,更改其背景图片: <com.android.Progress android:id="@+id/focus_seek ...

  6. 多设备官方教程(6)控制多版本API

    Supporting Different Platform Versions While the latest versions of Android often provide great APIs ...

  7. 同一客户代码下一个CPN对应多个FG会出现CPN描述一样的问题

    Q&A : D2E01客户下已经存在CPN: TP1062/A 对应FG: P5M2812512AFHHF0 直接在客户代码下无法新建,只能在交叉信息新建CPN: TP1062/A, 但无法修 ...

  8. BZOJ2741: 【FOTILE模拟赛】L

    2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1170  Solved: 303[Submit][Status] ...

  9. 打印grid

    void PrintButtonClick(object sender, EventArgs e) { PrintPreviewDialog dlg = new PrintPreviewDialog( ...

  10. lihgtoj 1006

    记忆化搜索下即可. #include<cstdio> #include<string> #include<cstring> #include<iostream ...