您的位置:首页 > Web前端 > JavaScript

JSP 文件上传下载系列之一[基本方式上传文件]

2013-08-07 18:50 381 查看

前言

在jsp的web项目中,很有可能会使用文件上传的功能。
把一个本地的文件上传到web 服务器的某个路径下。
对于java 来说, 实现这样功能的开源组件有很多, 比如较常用的commons-fileupload , 等等....
但是不管哪种组件,底层的原理应该都是一致的。 所以本系列从基本的方式和原理入手。

选择文件的按钮标签

<input type="file" />
这是一个HTML 的标签, 所以不管是ASP,JSP, PHP 使用的方式都是一样的。
此标签放在form 的标签里面,显示的效果是一个“选择文件”按钮, 点击之后会弹出一个文件选择的对话框。
此标签在不同的流量器中显示的效果可能会有不同(firefox和Chrome 的效果类似, 但是IE显示的效果就有差异。 )
当要在某个form 中添加 file 的标签时, form 的method 要设置成 “post”, enctype 设置成 "multipart/form-data",这样的话,在点击submit 提交时,
就会把文件的内容以数据流的形式放入页面的request 对象中。

配置类似:
<form action="BaseUpload.jsp" method="post" enctype="multipart/form-data">
	Please Select File: 
	<input type="file" name="upload" size="16"><br>
	<input type="submit" value="submit">
</form>


form 中 action的配置

action作用是form 中的数据抛到哪处理,处理之后返回什么。
对于jsp 而言, action 可以直接配置成 .jsp 的文件,也可以配置成一个servlet;如果有使用spring , 还可以是一个 .do 或是 link 什么的。

这里为了方便,实例中先直接使用 .jsp 的方式。

实例

1. 这里使用eclipse 开发, 所以先通过eclipse 建立一个动态的web 项目。
2. 在 WebContent 目录下建立,选择文件的页面 BaseUploadFile.jsp (后缀名也可以是.html)
<!-- Add By oscar999 -->
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="BaseUpload.jsp" method="post" enctype="multipart/form-data"> Please Select File: <input type="file" name="upload" size="16"><br> <input type="submit" value="submit"> </form>
</body>
</html>

2. 在同目录下定义action 的jsp BaseUpload.jsp

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="java.io.*"  %>
<%
String sFileName = "tempfile.txt";
String sFilePath = "D:\\temp\\upload\\files\\";

ServletInputStream in = request.getInputStream();
//FileOutputStream outputStream = new FileOutputStream(sFilePath+sFileName);
PrintWriter pw = new PrintWriter( new BufferedWriter(new FileWriter(sFilePath+sFileName))); 
int i = in.read();
while(i!=-1)
{
	pw.print((char)i);
	i = in.read();
}
pw.close();
in.close();
%>

这里的动作很简单, 就是把 request 的信息写入到一个txt 的文件中, 来验证一下是否如之前如之前所说,文件的内容会放入request 对象中。
3. 打包,部署 。测试。 查看产生的txt 文件内容

这里上传一个只有 "111" 这样的简单的 txt 文本。 在产生的文件中内容如下:
------WebKitFormBoundaryGsj8EiAn9BkPrhAf
Content-Disposition: form-data; name="upload"; filename="111.txt"
Content-Type: text/plain

111
------WebKitFormBoundaryGsj8EiAn9BkPrhAf--

由此, 就可以从request 得到上传文件的内容, 通过流的方式就可以写入到服务端了。

补充

1. 针对以上 action 的 BaseUpload.jsp , 也可以使用以下方式:
定义一个处理的java Bean, BaseUploadBean.java

/**   
 * @author oscar999   
 * @date 2013-8-7
 * @version V1.0   
 */
package com.oscar999;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;

public class BaseUploadBean {
	public void doUpload(HttpServletRequest request) throws

	IOException {

		String sFileName = "D:\\temp\\upload\\files\\tempfile.txt";
		
		PrintWriter pw = new PrintWriter(

		new BufferedWriter(new FileWriter(sFileName)));

		ServletInputStream in = request.getInputStream();

		int i = in.read();

		while (i != -1) {

			pw.print((char) i);

			i = in.read();

		}
		pw.close();
		in.close();

	}

}

这样BaseUpload.jsp的内容就可以简化成:
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="java.io.*" %>
<jsp:useBean id="TheBean" scope="page" class="com.oscar999.BaseUploadBean" />
<%
TheBean.doUpload(request);
%>

2. 另外, action 使用servlet 的方式
现在web.xml 配置servlet
<servlet>
  	<servlet-name>FileUploadServlet</servlet-name>
  	<servlet-class>com.oscar999.FileUploadServlet</servlet-class>
  </servlet>  
  
  <servlet-mapping>
  	<servlet-name>FileUploadServlet</servlet-name>
  	<url-pattern>/FileUploadServlet</url-pattern>
  </servlet-mapping>

然后在 dopost 方法中做类似的处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: