我们在做项目中经常要用到上传和下载的功能包括Excel文件word文档还有图片等不同格式的文件,今天特地搜搜了完成了上传功能,使用的是Servlet实现之,其实struts2也是封装了上传功能的本篇用servlet:
下面是我的基础代码
package com.ego.servlet; 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 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.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import com.ego.util.FileUtil; public class FileUploadServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 908207994857886273L; @Override protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { /* * 注意,当jsp中表单的enctype设置的为:multipart/form-data的时候 我们无法直接使用 * request.getParameter("") 获取表单的数据信息 */ // 使用DiskFileItemFacotry类进行表单的处理,以及文件的上传 DiskFileItemFactory disk = new DiskFileItemFactory(); //这里设置上传的文件存放的路径可以是绝对路径 //也可以获取项目位置 String path = req.getRealPath("C:/upload"); String path = "C:/upload"; FileUtil.judgeDirExists(path); //判断路径是否存在不存在自动创建路径 disk.setRepository(new File(path));//设置上传文件的缓存目录 disk.setSizeThreshold(1024*1024);//设置文件的大小,如果超过限制大小直接存进硬盘 //借助ServletFileUpload进行表单的解析,与文件的流处理 ServletFileUpload upload = new ServletFileUpload(disk); try { List<FileItem> list = upload.parseRequest(req); //List<FileItem>中保存着有关表单元素的所有信息 需要对它进行遍历 for(FileItem item:list){ //item.isFormField()判断该元素是否为表单的一个字段, //如果是则可以直接取得它的名称和内容 if(item.isFormField()){ String name = item.getFieldName(); /* * 获取该字段的名称 如:<input type="text" name="password"/> * 该方法便是获取name属性的值 :password */ String value = item.getString(); /*获取该字段的value属性的值gbk为页面编码*/ }else{ //如果item.isFormField()方法返回false则证明该item为一个File类型 String name = item.getFieldName(); String value = item.getName(); /* *对于表单中的file元素,我们不能通过getString()方法获取其内容,因为它是一个流 *只能够通过getName方法获取当前文件的名称 */ int start = value.lastIndexOf("\\"); //对value惊醒处理,由于某些浏览器可能只显示 文件名+后缀名 //有的则将文件的全部路径都显示和粗来,所有我们要在这里对它进行一次通用处理 String fileName = value.substring(start+1); //记住一定要将start+1因为start的位置对应的是'\\' req.setAttribute(name, fileName); //创建输入流 与输出流 InputStream input = item.getInputStream(); byte[] buffer = new byte[1024]; int length = 0; OutputStream os = new FileOutputStream(new File(path,fileName)); //开始读取并写入信息 while((length = input.read(buffer))>0){ os.write(buffer,0,length); } //一次关闭流 os.close(); input.close(); //上传完毕 System.out.println("上传完毕!"); } } } catch (Exception e) { e.printStackTrace(); } req.getRequestDispatcher("/result.jsp").forward(req, res); } }
这里用到了一个文件工具类:
写道
package com.ego.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 文件操作工具类
*
* @author ZhangZheng
* @date 2013-07-03
*/
public class FileUtil {
/**
* 判断某个文件是否存在
* >>如果不存在则创建该文件
* @param filePath 文件绝对路径
*/
public static void judgeFileExists(String filePath) throws IOException{
//根据路径获得文件对象
File file = new File(filePath);
//判断文件是否存在
if(!file.exists()){
//获得文件所在目录名称和文件名称
String dirStr = "";
String fileName = "";
if(filePath.lastIndexOf("/")>0){
dirStr = filePath.substring(0, filePath.lastIndexOf("/"));
fileName = filePath.substring(filePath.lastIndexOf("/"));
}else if(filePath.lastIndexOf("\\")>0) {
dirStr = filePath.substring(0, filePath.lastIndexOf("\\"));
fileName = filePath.substring(filePath.lastIndexOf("\\"));
}
//判断目录是否存在,如果不存在则创建该目录
File dir = new File(dirStr);
if(!dir.exists()){
dir.mkdirs();
}
//判断文件是否存在,如果不存在则创建该文件
File f = new File(fileName);
if(!f.exists()){
f.createNewFile();
}
}
}
/**
* 判断某个文件夹是否存在
* >>如果不存在则创建该文件夹及其子文件夹
* @param dirPath 文件夹路径
*/
public static void judgeDirExists(String dirPath){
File dir=new File(dirPath);
//如果文件夹不存在
if(!dir.exists()){
//创建文件夹(包括其中的子文件夹)
dir.mkdirs();
}
}
/**
* 复制文件
* >>把一个文件的内容复制到另一个文件中
* @param src 源文件路径
* @param dest 目标文件路径
*/
public static void copyFile(String src,String dest) throws IOException{
//判断目标文件是否存在
judgeFileExists(dest);
//源文件输入流和目标文件输出流
FileInputStream in = new FileInputStream(src);
FileOutputStream out = new FileOutputStream(dest);
int n;
byte[] buffer = new byte[1024];
while((n=in.read(buffer))!=-1){
//每次读取一个字节数组
out.write(buffer,0,n);
}
//关闭流
in.close();
out.close();
}
/**
* 复制文件
* @param in 源文件输入流
* @param out 目标文件输出流
*/
public static void copy(InputStream in, OutputStream out) throws IOException {
// 512K缓冲
byte[] buf = new byte[1024 * 512];
int n;
while ((n = in.read(buf)) != -1) {
out.write(buf, 0, n);
}
out.flush(); // 刷出缓冲到目标流
in.close();
out.close();
}
/**
* 删除文件夹(递归删除)
* @param file 要被删除的文件对象
*/
public static void deleteDir(File file){
//如果是文件
if(file.isFile() || file.list().length == 0){
file.delete();
}
//如果是文件夹
if(file.isDirectory()){
File[] files = file.listFiles();
//如果文件夹有子文件
if(files.length>0){
for(File f : files){
//递归删除每一个文件
deleteDir(f);
}
}
//最后删除该文件夹(不加此行代码表示:只删除该目录下的所有文件及其子文件夹,但保留该目录)
file.delete();
}
}
/**
* 删除文件(根据间隔时间删除)
* @param file 文件对象
* @param time 间隔时间(毫秒)
*/
public static void deleteFile(final File file,final int time){
//休眠指定时间之后,删除文件
new Thread(new Runnable() {
public void run() {
try {
// 线程休眠
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 删除文件
file.delete();
}
}).start();
}
// public static void main(String[] args) throws Exception {
// File file=new File("F:/co");
// System.out.println(file.exists());
// }
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 文件操作工具类
*
* @author ZhangZheng
* @date 2013-07-03
*/
public class FileUtil {
/**
* 判断某个文件是否存在
* >>如果不存在则创建该文件
* @param filePath 文件绝对路径
*/
public static void judgeFileExists(String filePath) throws IOException{
//根据路径获得文件对象
File file = new File(filePath);
//判断文件是否存在
if(!file.exists()){
//获得文件所在目录名称和文件名称
String dirStr = "";
String fileName = "";
if(filePath.lastIndexOf("/")>0){
dirStr = filePath.substring(0, filePath.lastIndexOf("/"));
fileName = filePath.substring(filePath.lastIndexOf("/"));
}else if(filePath.lastIndexOf("\\")>0) {
dirStr = filePath.substring(0, filePath.lastIndexOf("\\"));
fileName = filePath.substring(filePath.lastIndexOf("\\"));
}
//判断目录是否存在,如果不存在则创建该目录
File dir = new File(dirStr);
if(!dir.exists()){
dir.mkdirs();
}
//判断文件是否存在,如果不存在则创建该文件
File f = new File(fileName);
if(!f.exists()){
f.createNewFile();
}
}
}
/**
* 判断某个文件夹是否存在
* >>如果不存在则创建该文件夹及其子文件夹
* @param dirPath 文件夹路径
*/
public static void judgeDirExists(String dirPath){
File dir=new File(dirPath);
//如果文件夹不存在
if(!dir.exists()){
//创建文件夹(包括其中的子文件夹)
dir.mkdirs();
}
}
/**
* 复制文件
* >>把一个文件的内容复制到另一个文件中
* @param src 源文件路径
* @param dest 目标文件路径
*/
public static void copyFile(String src,String dest) throws IOException{
//判断目标文件是否存在
judgeFileExists(dest);
//源文件输入流和目标文件输出流
FileInputStream in = new FileInputStream(src);
FileOutputStream out = new FileOutputStream(dest);
int n;
byte[] buffer = new byte[1024];
while((n=in.read(buffer))!=-1){
//每次读取一个字节数组
out.write(buffer,0,n);
}
//关闭流
in.close();
out.close();
}
/**
* 复制文件
* @param in 源文件输入流
* @param out 目标文件输出流
*/
public static void copy(InputStream in, OutputStream out) throws IOException {
// 512K缓冲
byte[] buf = new byte[1024 * 512];
int n;
while ((n = in.read(buf)) != -1) {
out.write(buf, 0, n);
}
out.flush(); // 刷出缓冲到目标流
in.close();
out.close();
}
/**
* 删除文件夹(递归删除)
* @param file 要被删除的文件对象
*/
public static void deleteDir(File file){
//如果是文件
if(file.isFile() || file.list().length == 0){
file.delete();
}
//如果是文件夹
if(file.isDirectory()){
File[] files = file.listFiles();
//如果文件夹有子文件
if(files.length>0){
for(File f : files){
//递归删除每一个文件
deleteDir(f);
}
}
//最后删除该文件夹(不加此行代码表示:只删除该目录下的所有文件及其子文件夹,但保留该目录)
file.delete();
}
}
/**
* 删除文件(根据间隔时间删除)
* @param file 文件对象
* @param time 间隔时间(毫秒)
*/
public static void deleteFile(final File file,final int time){
//休眠指定时间之后,删除文件
new Thread(new Runnable() {
public void run() {
try {
// 线程休眠
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 删除文件
file.delete();
}
}).start();
}
// public static void main(String[] args) throws Exception {
// File file=new File("F:/co");
// System.out.println(file.exists());
// }
}
写道
<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="gbk"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>Insert title here</title>
</head>
<script type="text/javascript">
//一定要设置form表单的 //method属性和enctype实行
</script>
<body>
<form action="uploadServlet" method="post"
enctype="multipart/form-data">
用户名:<input type="text" name="username" id="username" /><br />
密码:<input type="password" name="password" id="password" /><br />
上传文件: <input type="file" name="file" id="file" /><br />
<input type="submit" value="提交" />
</form>
</body>
</html>
pageEncoding="gbk"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>Insert title here</title>
</head>
<script type="text/javascript">
//一定要设置form表单的 //method属性和enctype实行
</script>
<body>
<form action="uploadServlet" method="post"
enctype="multipart/form-data">
用户名:<input type="text" name="username" id="username" /><br />
密码:<input type="password" name="password" id="password" /><br />
上传文件: <input type="file" name="file" id="file" /><br />
<input type="submit" value="提交" />
</form>
</body>
</html>
相关推荐
本文实例为大家分享了JSP+Servlet实现文件上传到服务器功能的具体代码,供大家参考,具体内容如下 项目目录结构大致如下: 正如我在上图红线画的三个东西:Dao、service、servlet 这三层是主要的结构,类似 MVC ...
在本篇讨论中,我们将深入探讨如何利用Servlet实现文件上传功能,以及在这个过程中涉及的关键知识点。 首先,我们需要了解HTTP协议。HTTP协议是无状态的,这意味着每次请求都是独立的。因此,在客户端(通常是...
### Servlet实现文件上传与下载 #### 一、概述 在Web开发中,文件的上传与下载是一项非常常见的功能需求。本文将详细介绍如何使用Java Servlet技术实现文件的上传和下载功能。我们将通过一个简单的示例来展示整个...
### jsp+servlet实现文件上传下载 在现代Web开发中,文件上传下载是常见的功能之一。JSP(JavaServer Pages)与Servlet技术结合可以轻松实现这一功能。本篇将详细介绍如何利用jspSmartUpload组件实现文件的上传与...
### 使用JSP与Servlet实现文件上传的深度解析 在当今的网络应用开发中,文件上传功能已成为不可或缺的一部分,尤其在电子商务、社交平台、多媒体分享等领域。本文将深入探讨如何运用JSP(JavaServer Pages)与...
本文将详细介绍如何使用Servlet实现文件上传功能,包括支持多文件上传。关键知识点包括Servlet接口、Multipart解析器、文件处理和常见配置。 首先,为了实现文件上传,我们需要依赖Apache Commons FileUpload库,它...
无组件用servlet实现文件上传,可以定义文件类型和大小,可以实现多文件上传。 包含全部源码,在tomcat下测试通过。 欢迎下载使用,可以随意修改和发布。 说明:源文件放在uptest\WEB-INF\classes下。
在这个场景下,我们将探讨如何结合`jQuery ajaxFileUpload` 和Servlet实现文件上传的功能。 首先,`jQuery ajaxFileUpload` 插件允许用户在不刷新页面的情况下上传文件,提供了一种友好的用户体验。它的主要优点...
在这个主题中,“jsp+servlet实现文件上传和下载”是核心知识点,我们将深入探讨如何利用这两个组件以及Apache的`commons-fileupload`和`commons-io`库来完成这一任务。 1. **文件上传** 文件上传通常涉及用户通过...
本知识点主要聚焦于如何利用JSP和Servlet实现文件上传功能,这是一个在Web应用中非常实用的功能,例如用户在网站上提交简历、上传图片等。 首先,我们需要了解文件上传的基本原理。HTTP协议本身不支持文件上传,但...
在这个“JSP+servlet实现文件上传”的项目中,开发者提供了六个实例,涵盖了从用户选择文件到服务器接收并存储文件的整个过程。通过这个项目,我们可以学习到以下关键知识点: 1. **JSP基础知识**: JSP是一种基于...
本教程将详细讲解如何使用Servlet实现文件的上传和下载功能,其中涉及到的主要技术点包括Servlet API、Multipart解析以及文件流操作。 首先,我们需要了解Servlet在文件上传中的作用。Servlet在接收到客户端(通常...
通过以上步骤,你可以成功地在CKEditor 3.6.0中集成Servlet实现的文件上传功能。这个过程不仅适用于图片,还可以扩展到其他类型的文件,如文档、音频和视频。注意在实际应用中,根据服务器环境和项目需求进行相应的...
在这个"Servlet 文件上传下载例子"中,我们将探讨如何使用Servlet实现文件的上传和下载功能,这对于构建一个简单的图片文件服务器至关重要。 1. **文件上传** - **MultipartRequest**: 在Servlet中,处理文件上传...
以下是一个简单的Servlet实现文件上传的代码示例: ```java import javax.servlet.http.*; import java.io.IOException; import java.util.List; public class FileUploadServlet extends HttpServlet { ...
【摘要】:该文介绍了在B/S模式下,通过JSP/Servlet技术实现文件上传的方法。 文件上传在很多网站应用中是必不可少的,在电子商务中上传商品图片,在音乐网站中上传流行歌曲……一个高效率的文件上传功能尤为重要。...
在IT行业中,实现文件上传功能是一项常见的需求,尤其是在Web应用中。DWR(Direct Web Remoting)和Servlet的结合提供了一种有效的方式来处理文件上传。本文将深入探讨如何利用DWR与Servlet实现在Web应用程序中添加...
本示例结合了前端的Vue.js框架和后端的Servlet技术,提供了一种实现文件上传的解决方案。Vue.js是一个轻量级的渐进式JavaScript框架,而Servlet则是Java Web开发中的核心组件,用于处理HTTP请求和响应。接下来,我们...