一、准备材料

1、apache提供的包,效率高,且实用性强:

  ( 1)、commons-fileupload-1.3.1.jar

   (2)、commons-io-2.4.jar

2、 jdk1.6以上

 

二、上传实现的代码

 1、upload.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>


<html>

<head>

<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">

<meta http-equiv="cache-control" content="no-cache">

<meta http-equiv="expires" content="0">

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

<meta http-equiv="description" content="This is my page">
</head>
<body>

<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">

<!--enctype属性值的意义-->

<input type="file" name="myfile">
<input type="text" name="mytext" value="123456"/>

<input type="text" name="mytext" value="123456"/>

<input type="submit" value="确认上传">

</form>

</body>

</html>

 

application/x-www-form-urlencoded在发送前对所有字符进行编码(默认)。multipart/form-data不对字符编码。当使用有文件上传控件的表单时,该值是必需的。text/plain将空格转换为 "+" 符号,但不编码特殊字符。

2、servlet代码

package com.test.upload;



import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.HttpRetryException;

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.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;



@SuppressWarnings("serial")

public class UploadServerlt extends HttpServlet {

public void service(HttpServletRequest request, HttpServletResponse response)

throws HttpRetryException, IOException {

try {

//解析http请求

boolean isMultipart = ServletFileUpload.isMultipartContent(request);

//解析成功

if (isMultipart == true) {

// 获得磁盘文件条目工厂

FileItemFactory factory = new DiskFileItemFactory();

// 高水平的API文件上传处理,将文件保存在服务器硬盘

ServletFileUpload upload = new ServletFileUpload(factory);

//设置上传的单个文件的大小6M

upload.setSizeMax(6*1024*1024);

//设置上传的总文件的大小40M

upload.setFileSizeMax(40*1024*1024);

//http中的复杂表单元素都被看作是FileItem,所以可以上传多个文件

List<FileItem> fileItemList = upload.parseRequest(request);

//如果表单内容不为空

if (fileItemList != null) {

//遍历内容

for (FileItem fileItem: fileItemList) {

//如果是字符:<input type="text" name="mytext" value="123456"/>

if (fileItem.getFieldName().equalsIgnoreCase("mytext")) {

String text2 = fileItem.getString();

}

//如果是文件:<input type="file" name="myfile">

if (fileItem.getFieldName().equalsIgnoreCase("myfile")) {

InputStream in = fileItem.getInputStream();

//写入指定目录下

FileOutputStream fos = new FileOutputStream("F:/232.zip");

byte[] buffer = new byte[1024];

int length;

while ((length = in.read(buffer)) != -1) {

fos.write(buffer, 0, length);

}

in.close();

fos.close();

//清除应用服务器下的临时文件

fileItem.delete();

}

}

}

request.getRequestDispatcher("/index.jsp").forward(request,response);

}

} catch (Exception e) {

e.printStackTrace();

try {

request.getRequestDispatcher("/error.jsp").forward(request,response);

} catch (ServletException e1) {

e1.printStackTrace();

}

}

}

}
3、web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
​​http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">​​
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 测试上传文件 -->
<servlet>
<servlet-name>Upload</servlet-name>
<servlet-class>com.test.upload.UploadServerlt</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Upload</servlet-name>
/upload</url-pattern>
</servlet-mapping>
</web-app>

4、访问地址:http://localhost:8080/TestServer/jsp/upload.jsp
5、点击后成功
三、实现下载的代码
1、DownFileServlet.java
package com.test.downFile;

import java.io.FileInputStream;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class DownFileServlet extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException{
//获取下载的文件名称
String downPath=(String)request.getParameter("downPath");
try {
//通过response响应返回给客户端
response.setHeader("Content-Disposition","attachment;filename=\""+new String (downPath.getBytes("GBK"),"ISO8859-1")+"\"");//文件名称
//开始写给客户端
FileInputStream fis=new FileInputStream("F://"+downPath);//注意正则表达式的冲突,所以使用//
byte b[]=new byte[1024];
int length;
while((length=fis.read(b))>0){
response.getOutputStream().write(b,0,length);
}
fis.close();
response.getOutputStream().flush();//最好加上这句话,否则缓存会存在
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.downFile.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<form action="${pageContext.request.contextPath}/downFile" method="post" >
<!-- 指定路径,实际的项目中应该是从数据库中获取 -->
<input type="text" name="downPath" value="img.zip"/>
<input type="submit" value="点击下载">
</form>
</body>
</html>
3、web.xml文件配置
<!-- 测试下载文件 -->
<servlet>
<servlet-name>DownFile</servlet-name>
<servlet-class>com.test.downFile.DownFileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DownFile</servlet-name>
<url-pattern>/downFile</url-pattern>
</servlet-mapping>