`

文件的上传和下载(jsp+servlet)

 
阅读更多

1 导入jar包

 2 文件上传

 

	<form action="uploadServlet" method="post" encType="multipart/form-data">
  		<input type="file" name="f"><br>
                <input type="text" name="username"><br>
		<input type="submit" value="上传">
  	</form>

  

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
		ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
		try {
			List<FileItem> items = fileUpload.parseRequest(request);
			for (FileItem fileItem : items) {
				if(!fileItem.isFormField()){
					String name = fileItem.getName();
					System.out.println(name+"-----getName");
					name = name.substring(name.lastIndexOf("\\")+1);
					System.out.println(name);
					FileOutputStream fos = new FileOutputStream("d:/upload/"
							+ name);
					IOUtils.copy(fileItem.getInputStream(), fos);
					
				}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
	}

   首先文件上传的中有三个核心类,分别是DiskFileIItemFactory 和 servletFileUpload 还有 FileItem ,前面的两个核心类都是写死的,

然后重点说一下,调用ServletFileUpload的parseRequest()方法,得到的这个集合,这个集合中的泛型就是表单项。

类似与上面的表单就有两个表单项,那么我们遍历这个集合,然后判断是否是文件上传的表单项。

通过那个if的条件进行判断,当里面的方法返回值是true的时候,那么就代表这个表单项不是文件上传的表单项,

所以我在判断的时候,如果返回值为!那么这个就是我的上传表单项,fileItem有个方法 getName,这个方法根据浏览器的不同,

有时候上传的值也是不同的。IE浏览器上传文件之后就是这个文件的路径名+文件本身的名,例如a.txt,上传就是文件的路径+a.txt,

但是有的浏览器上传文件的getname就是文件本身的名称,例如就是a.txt,没有文件的路径。

所以为了保险起见,我们给name进行一下处理,进行一下切割,找到最后一个\ (需要进行转义一下,转义之后是\\),然后我创建一个文件输出流,然后调用IoUtils.copy ,

传入文件输入流,和文件输出流,其实这个方法的实现底层就是io流读写之间的转换。

        String name = item.getName(); // 上传文件名称
	System.out.println(name);
	name = name.substring(name.lastIndexOf("\\") + 1);
	System.out.println("上传组件:" + name);
	
	String msg = item.getString();
	System.out.println(msg);

	 //获取上传文件内容,完成文件 上传操作
	 InputStream is = item.getInputStream();
	byte[] b = new byte[1024];
	 int len = -1;
	FileOutputStream fos = new FileOutputStream("d:/upload/"
			+ name);
	 while ((len = is.read(b)) != -1) {
	
	 fos.write(b, 0, len);
	
	 }
	 fos.close();
	 is.close();

	IOUtils.copy(item.getInputStream(), fos);

    其实我们在实际的项目中,我们文件的上传路径不能使用硬编码的方式,我们一般在webRoot下创建一个上传的文件夹,temp,

请注意,最好不要放在web-inf 和 mat-inf中。然后我创建DiskFileItemFactory使用另一构构造方法。

 

File file = new File(this.getServletContext().getRealPath("/temp"));
// 获取temp目录部署到tomcat后的绝对磁盘路径
DiskFileItemFactory factory = new DiskFileItemFactory(1024 * 100, file);
 // 使用默认的.

   构造方法中的参数一个是上传文件的最大的值,另一个是上传文件的临时存储目录,首先,当我们使用无参数的构造的时候,

上传文件是默认存储在内存中的,类似与小的文本文档存储在内存中是可以的,

  但是如果文件过大,那么直接存储在内存中效率低下,那么我们需要构建一个临时的文件存储目录。

下面的这张图片说一下fileItem的一些常用api。

 

 

下面说一下文件下载

 

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 1.得到要下载 的文件名称
		String filename = request.getParameter("filename");

		filename = new String(filename.getBytes("iso8859-1"), "utf-8");
                 // 解决中文乱码

		// 2.在d:/upload目录下查找这个文件是否存在
		File file = new File("d:/upload/" + filename);
		if (file.exists()) {
			// /文件存在,完成下载

			// 下载注意事项1--设置下载文件的mimeType
	  String mimeType = this.getServletContext().getMimeType(filename);
			response.setContentType(mimeType);

			String agent = request.getHeader("user-agent");
			if (agent.contains("MSIE")) {
				// IE浏览器
				filename = URLEncoder.encode(filename, "utf-8");

			} else if (agent.contains("Firefox")) {
				// 火狐浏览器
			BASE64Encoder base64Encoder = new BASE64Encoder();
			filename = "=?utf-8?B?"
			+ base64Encoder.encode(filename.getBytes("utf-8"))
					+ "?=";
			} else {
				// 其它浏览器
				filename = URLEncoder.encode(filename, "utf-8");
			}

			// 下载注意事项2--永远是下载
		response.setHeader("content-disposition", "attachment;filename="
					+ filename);

	FileInputStream fis = new FileInputStream(file); // 读取要下载文件的内容
        OutputStream os = response.getOutputStream(); 
             // 将要下载的文件内容通过输出流写回到浏览器端.
			int len = -1;
			byte[] b = new byte[1024 * 100];

			while ((len = fis.read(b)) != -1) {
				os.write(b, 0, len);
				os.flush();
			}
			os.close();
			fis.close();

		} else {
			throw new RuntimeException("下载资源不存在.");
		}
	}

 

 

<body>
<a href='${pageContext.request.contextPath}/download?filename=a.bmp'>a.bmp</a><br>
<a href='${pageContext.request.contextPath}/download?filename=a.doc'>a.doc</a><br>
<a href='${pageContext.request.contextPath}/download?filename=a.txt'>a.txt</a><br>
<a href='${pageContext.request.contextPath}/download?filename=天空.mp3'>天空.mp3
</a><br>
  </body>

 

 

 

  • 大小: 2.2 KB
  • 大小: 12.7 KB
分享到:
评论

相关推荐

    jsp+servlet+javabean+ajax MVC模式,增删改查,数据分页显示

    总结来说,这个项目展示了如何使用`JSP+Servlet+JavaBean+Ajax`实现基于MVC模式的Web应用,包括基本的数据操作、分页显示以及文件上传功能。对于初学者,这样的实践能够帮助理解Web开发的基本流程和关键组件,同时...

    基于jsp+servlet的博客

    Servlet接收上传文件,将其保存到服务器的指定目录,并将路径信息存入数据库,以便在JSP页面中展示。 - **权限管理**:通过Servlet实现用户角色划分,例如普通用户只能阅读和评论,而管理员可以发布、编辑和删除文章...

    jsp+servlet实现大型文件下载

    本教程将深入讲解如何利用JSP和Servlet来实现大型文件的下载功能,这对于构建高效、稳定的Web应用至关重要。 一、Servlet简介 Servlet是Java平台上的一个标准接口,用于扩展服务器的功能。在Web开发中,Servlet通常...

    纯jsp+servlet版的多文件上传与下载

    总结,这个项目展示了如何在传统的Java Web环境中使用JSP和Servlet实现文件上传和下载功能,同时利用Apache Commons FileUpload库简化了文件上传的复杂性。对于初学者,这是一个很好的实践案例,能够深入理解MVC模式...

    一个简单的JSP+Servlet图片上传例子

    总的来说,这个JSP+Servlet图片上传例子展示了Web应用中的客户端-服务器通信基本流程,涵盖了表单提交、文件上传处理和服务器响应等关键概念。对于学习Java Web开发的初学者来说,这是一个很好的起点,可以帮助他们...

    jsp+servlet实现文件上传下载

    ### jsp+servlet实现文件上传下载 在现代Web开发中,文件上传下载是常见的功能之一。JSP(JavaServer Pages)与Servlet技术结合可以轻松实现这一功能。本篇将详细介绍如何利用jspSmartUpload组件实现文件的上传与...

    文件上传下载【jsp+servlet】

    总的来说,这个项目展示了如何利用JSP和Servlet来实现一个基本的文件上传下载系统,涵盖了Web开发中的基础技术,对于学习Java Web开发的初学者来说,是一个很好的实践案例。在实际应用中,还可以进一步优化,如增加...

    jsp+servlet实现图片上传

    在本文中,我们将深入探讨如何使用Java的JSP(JavaServer Pages)和Servlet技术来实现一个图片上传功能。这是一个常见的Web开发任务,特别是在构建交互性强、动态内容丰富的网站时。以下是一些关键知识点: 1. **...

    jsp+servlet实现文件上传和下载

    在这个主题中,“jsp+servlet实现文件上传和下载”是核心知识点,我们将深入探讨如何利用这两个组件以及Apache的`commons-fileupload`和`commons-io`库来完成这一任务。 1. **文件上传** 文件上传通常涉及用户通过...

    定点定时长音乐播放系统,带进度条的文件批量上传(jquery+plupload+jsp+servlet)

    定点定时长音乐播放系统,带进度条的文件批量上传(jquery+plupload+jsp+servlet),该系统没有使用数据库,不需要过多的配置就可以使用,在项目中有一个文档,说明该系统的使用方法与注意事项。

    jsp+servlet 图片上传

    实践中,还可能涉及到安全性优化,如使用MIME类型检查防止恶意文件上传,使用CDN存储图片以减轻服务器压力,以及使用session或cookie进行用户验证等。总的来说,理解和熟练掌握`JSP`和`Servlet`的配合使用,对于开发...

    文件上传 JSP + Servlet

    `JSP+Servlet+JavaBean文件上传`可能是一个包含所有源代码和资源的子目录,其中包括JSP页面、Servlet类和可能用到的JavaBean(如果用于处理业务逻辑或数据持久化)。JavaBean通常用于封装数据,使代码结构更清晰。 ...

    jsp+servlet文件上传数据库和下载

    在Java Web开发中,"jsp+servlet文件上传数据库和下载"是常见的功能需求,涉及到的主要技术包括JSP(JavaServer Pages)、Servlet、文件处理以及数据库操作。以下将详细阐述这些知识点。 1. JSP(JavaServer Pages...

    jsp+servlet 品红项目 源代码

    4. **上传与下载功能**:在Web应用中,文件上传和下载是常见的需求。在这个项目中,Servlet可能实现了文件上传的逻辑,处理客户端上传的文件,将其存储在服务器的特定位置。同时,提供了一个下载接口,允许用户根据...

    文件管理系统(jsp+servlet+mysql)

    实现的功能有:登陆,注册,管理员管理用户界面(冻结,解冻,注销),管理员管理文件界面(删除,审核(在做)),然后是用户管理自己的文件界面,有上传,下载,删除,在线编辑,修改,查询,分页功能。...

    java web 实战宝典_JSP+Servlet+Struts_2+Hibernate+Spring+Ajax

    与JSP不同的是,Servlet更偏向于逻辑控制和业务处理,通常用于处理表单提交的数据、数据库连接、文件上传下载等操作。Java的Servlet API提供了一系列的接口和类,使得开发者可以专注于业务逻辑的实现。 Ajax...

    基于jsp+javabean+servlet模式的仓库管理系统报告

    在信息技术领域,开发Web应用程序时,经常使用Java技术栈,其中jsp(JavaServer Pages)、javabean和servlet是核心组件。本报告将深入探讨基于这三种技术构建的仓库管理系统,以揭示其背后的架构原理、设计模式以及...

    JSP+Servlet实现文件上传到服务器功能

    本文实例为大家分享了JSP+Servlet实现文件上传到服务器功能的具体代码,供大家参考,具体内容如下 项目目录结构大致如下: 正如我在上图红线画的三个东西:Dao、service、servlet 这三层是主要的结构,类似 MVC ...

    JSP+Servlet+cos文件上传下载Jar包.rar

    总的来说,"JSP+Servlet+cos文件上传下载Jar包.rar"为Java Web开发提供了一个高效且易于使用的工具集,帮助开发者快速构建具备文件上传和下载功能的Web应用。通过理解并熟练运用这些库,你可以提升你的Web开发技能,...

Global site tag (gtag.js) - Google Analytics