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);
	}

}

  

时间: 2024-08-07 17:01:57

JavaWeb文件的上传与下载(1)的相关文章

JavaWeb 文件的上传、下载

文件上传 表单 <form action="HandlerServlet" method="post" enctype="multipart/form-data"> 请选择要上传的文件:<input type="file" name="uploadFile" accept="*/*" multiple /><br /> <button type=

使用Loadrunner进行文件的上传和下载

最近使用loadrunner中需要录制文件的上传和下载,上传功能模块利用录制可以直接实现,下载无法实现,在网上找到了一段代码,自己动手试验了下,发现没有用 辛苦找到的,还是记录下吧 (1)LoadRunner上传文件 web_submit_data("importStudent.do", "Action=https://testserver/console/importStudent.do", "Method=POST", "EncTy

【Linux命令】--(4)文件打包上传和下载

文件打包上传和下载 +++++++++++++++++++++++++++++++用SecureCRT来上传和下载文件tar命令gzip命令+++++++++++++++++++++++++++++++先把计划放着,待老夫国庆把它学完!

【php】文件的上传与下载

一. 生活中常见的地方: a) 例如邮箱.空间.文库.百度云.微爱等地方,都可以看到文件的上传和下载的应用,因此,上传和下载的功能非常重要!二. PHP当中的文件上传和下载 a) 我们需要进行一些设置,来使我们的表单具有提交文件的功能! b) 客户端的设置: i. 其实就是表单的设置: 1. input表单项中的type属性值必须是file类型 2. form表单头部需要添加一个通行证:enctype="multipart/form-data",含义为让服务器认识到我们要在这个表单中上

SpringMVC实现文件的上传和下载

前些天一位江苏经贸的学弟跟我留言问了我这样一个问题:"用什么技术来实现一般网页上文件的上传和下载?是框架还是Java中的IO流".我回复他说:"使用SpringMVC框架可以做到这一点,因为SpringMVC为文件的上传提供了直接的支持,但需要依赖Apache提供Commons FileUpload组件jar包."鉴于这个问题,我上网也百度了一下,网上很多都是介绍的使用IO流来实现文件的上传和下载,也有说到框架的,但介绍的并不是很完整,今天小钱将和大家介绍使用Spr

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

SecureCRT可以使用sz和rz命令进行文件的上传和下载. sz文件下载: 格式:sz 文件名称 即可将服务器的文件下载至本地. rz文件上传: 格式:rz 文件名称 即可将本地文件上传至服务器. 本地文件夹可以通过Options-->Session Options中进行设置.

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

感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: 复制代码代码如下: YYViewController.m#import "YYViewController.h" #define YYEnc

JSP中文件的上传于下载示例

一.文件上传的原理 1.文件上传的前提: a.form表单的method必须是post b.form表单的enctype必须是multipart/form-data(决定了POST请求方式,请求正文的数据类型) 注意:当表单的enctype是multipart/form-data,传统的获取请求参数的方法失效. 请求正文:(MIME协议进行描述的,正文是多部分组成的) -----------------------------7dd32c39803b2 Content-Disposition:

步步为营-70-asp.net简单练习(文件的上传和下载)

大文件的上传一般通过FTP协议,而一般小的文件可以通过http协议来完成 1 通过asp.net 完成图片的上传 1.1 创建html页面 注意:1 method="post" ;2 enctype="multipart/form-data"; 3 <input type="file" /> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml&