文件上传和下载

上传
UploadServlet

package cn.itcast.fileupload;

import java.io.;
import java.util.;
import javax.servlet.;
import javax.servlet.http.;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
response.setContentType(“text/html;charset=utf-8”);
DiskFileItemFactory factory= new DiskFileItemFactory();
File f= new File(“D:\glc”);
if(!f.exists()) {
f.mkdirs();
}
factory.setRepository(f);

	ServletFileUpload fileupload= new ServletFileUpload(factory);
	fileupload.setHeaderEncoding("utf-8");
	List<FileItem> fileitems= fileupload.parseRequest(request);
	PrintWriter writer = response.getWriter();
	for(FileItem fileitem:fileitems) {
		if(fileitem.isFormField()) {
			String name=fileitem.getFieldName();
			if(name.equals("name")) {
				if(!fileitem.getString().equals("")) {
					String value = fileitem.getString("utf-8");
					writer.print("上传者:"+value+"<br/>");
				}
			}
		}else {
			String filename=fileitem.getName();
			if(filename!=null && !filename.equals("")) {
				writer.print("上传的文件名称:"+filename+"<br/>");
				filename=filename.substring(filename.lastIndexOf("\\") + 1);
				
				filename=UUID.randomUUID().toString()+"_"+filename;
				String webPath="/upload/";
				String filepath=getServletContext().getRealPath(webPath+filename);
				
				File file= new File(filepath);
				file.getParentFile().mkdirs();
				file.createNewFile();
				
				InputStream in= fileitem.getInputStream();
				FileOutputStream out= new FileOutputStream(file);
				
				byte[] buffer=new byte[1024];
				int len;
				while((len=in.read(buffer))>0) {
					out.write(buffer,0,len);
				}
				in.close();
				out.close();
				
				fileitem.delete();
				writer.print("文件上传成功! <br/>");
			}
		}
	}
	
	
	
}catch(Exception e) {
	throw new RuntimeException(e);
}

}
protected void doPost1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}

创建Servlet
该类用于获取From表单及其上传文件的信息

package cn.itcast.fileupload;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**

Servlet implementation class UploadServlet
*/
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

/**

@see HttpServlet#HttpServlet()
/
/
*

@see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
response.setContentType(“text/html;charset=utf-8”);
DiskFileItemFactory factory=new DiskFileItemFactory();
File f=new File(“D:\Temp”);
if(!f.exists()) {
f.mkdirs();
}
factory.setRepository(f);

ServletFileUpload fileupload=new ServletFileUpload(factory);
fileupload.setHeaderEncoding(“utf-8”);
List fileitems=fileupload.parseRequest(request);

for(FileItem fileitem:fileitems) {
if (fileitem.isFormField()) {
String name=fileitem.getFieldName();
if(name.equals(“name”)) {
if(!fileitem.getString().equals("")) {
String value=fileitem.getString(“utf-8”);
response.getWriter().print(“上传者:”+value+"
");
}
}
}else {
String filename=fileitem.getName();
if(filename !=null && !filename.equals("")) {
response.getWriter().print(“上传的文件名称是:”+filename+"
");
filename=filename.substring(filename.lastIndexOf("\")+1);
filename=UUID.randomUUID().toString()+"_"+filename;
String webPath="/upload/";
String filepath=getServletContext().getRealPath(webPath+filename);
File file=new File(filepath);
file.getParentFile().mkdirs();
file.createNewFile();
InputStream in=fileitem.getInputStream();
FileOutputStream out =new FileOutputStream(file);
byte[] buffer=new byte[1024];
int len;
while ((len=in.read(buffer))>0)out.write(buffer,0,len);
in.close();
out.close();
fileitem.delete();
response.getWriter().print(“上传文件成功!
”);
}
}
}
}catch(Exception e) {
throw new RuntimeException(e);

}
1
}
/**

@see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
下载
DownloadServlet

package cn.itcast.fileupload;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**

Servlet implementation class DownloadServlet
*/
@WebServlet("/DownloadServlet")
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

/**

@see HttpServlet#HttpServlet()
/
public DownloadServlet() {
super();
// TODO Auto-generated constructor stub
}
/
*

@see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request,response);
response.setContentType(“text/html;charset=utf-8”);
String filename=request.getParameter(“filename”);
filename= new String (filename.getBytes(“iso-8859-1”),“utf-8”);

String fileType=getServletContext().getMimeType(filename);

response.addHeader(“Content-Type”, “application/octet-stream”);
response.addHeader(“Content-Disposition”, “attachment;filename=”+filename);

String folder="/download/";

InputStream in = getServletContext().getResourceAsStream(folder+filename);
OutputStream out= response.getOutputStream();

byte[] buffer=new byte[1024];
int len;
while((len=in.read(buffer)) !=-1) {
out.write(buffer,0,len);
}
}

/**

@see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
}

=

要实现Web开发中的文件上传功能,通常需要完成两步操作:一.是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。
需要使用一个Apache组织提供一个开源组件Commons-FileUpload,在使用这个组件的时候,要导入

FileUpload组件实现文件上传的工作流程

1.1创建项目、导入JAR包
在Eclipse中创建一个名称为chapter12的web项目,在项目的WEB-INF/lib目录下导入JAR包(如下图红框勾选),并发布到类的路径下。导入JAR包的项目结构如下图所示。

1.2创建上传界面
在chap12项目的webapp目录下创建一个名称为form的JSP页面,该页面用于提供文件上传的Form表单,需要注意的是,Form表单的enctype属性值要设置为“multipart/form-data”,method属性值要设置为“post”,并将其action的属性值设置为“UploadServlet”。From.jsp的代码如文件所示。

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

文件上传
上传者
上传文件

1.3创建Servlet
在项目的src目录下创建一个名称为cn.incast.fileupload的包,在该包中编写一个名称为UploadServlet的类,该类主要用于获取表单及其上传文件的信息,其具体实现代码如下图所示。

package cn.itcast.chap12.fileupload;
import java.io.;
import java.util.
;
import javax.servlet.;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.
;
import org.apache.commons.fileupload.;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@WebServlet("/UploadServlet")
//上传文件的Servlet类
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
//设置ContentType字段值
response.setContentType(“text/html;charset=utf-8”);
// 创建DiskFileItemFactory工厂对象
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置文件缓存目录,如果该目录不存在则新创建一个
File f = new File(“D:\TempFolder”);
if (!f.exists()) {
f.mkdirs();
}
// 设置文件的缓存路径
factory.setRepository(f);
factory.setSizeThreshold(1024
1024);
// 创建 ServletFileUpload对象
ServletFileUpload fileupload = new ServletFileUpload(factory);
//设置字符编码
fileupload.setHeaderEncoding(“utf-8”);
// 解析 request,得到上传文件的FileItem对象
List fileitems = fileupload.parseRequest(request);
//获取字符流
PrintWriter writer = response.getWriter();
// 遍历集合
for (FileItem fileitem : fileitems) {
// 判断是否为普通字段
if (fileitem.isFormField()) {
// 获得字段名和字段值
String name = fileitem.getFieldName();
if(name.equals(“name”)){
//如果文件不为空,将其保存在value中
if(!fileitem.getString().equals("")){
String value = fileitem.getString(“utf-8”);
writer.print(“上传者:” + value + “
”);
}
}
} else {
// 获取上传的文件名
String filename = fileitem.getName();
//处理上传文件
if(filename != null && !filename.equals("")){
writer.print(“上传的文件名称是:” + filename + “
”);
// 截取出文件名
filename = filename.substring(filename.lastIndexOf("\") + 1);
// 文件名需要唯一
filename = UUID.randomUUID().toString() + “_” + filename;
// 在服务器创建同名文件
String webPath = “/upload/”;
//将服务器中文件夹路径与文件名组合成完整的服务器端路径
String filepath = getServletContext().getRealPath(webPath + filename);
// 创建文件
File file = new File(filepath);
file.getParentFile().mkdirs();
file.createNewFile();
// 获得上传文件流
InputStream in = fileitem.getInputStream();
// 使用FileOutputStream打开服务器端的上传文件
FileOutputStream out = new FileOutputStream(file);
// 流的对拷
byte[] buffer = new byte[1024];//每次读取1个字节
int len;
//开始读取上传文件的字节,并将其输出到服务端的上传文件输出流中
while ((len = in.read(buffer)) > 0)
out.write(buffer, 0, len);
// 关闭流
in.close();
out.close();
// 删除临时文件
fileitem.delete();
writer.print(“上传文件成功!
”);
}
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曾炟zd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值