① 客户端必须以二进制形式提交数据
a) 在form表单中添加enctype=“multipart/from-data“
b) ②当在表单中添加enctype,request中提交的数据形式就发生了改变,我们就不能以request.getParameter这种方式接受数据了,我们需要对request中接受的数据进行处理后才能接受
接受客户端提交的文件的方式有两种:
① fileupload上传:依赖于commons包中的jar文件
a) 将四个jar文件导入工程文件中
//在Servlet接受页面提交的数据
//通过传统的request接受方式,我们只能够接收到客户端提交的文本信息
//如果客户端想服务器端提交一个文件,服务器端则无法接受提交的文件
// String file=req.getParameter("myFile");
// String des=req.getParameter("des");
// System.out.println(file+"<><><>\n"+"<><><>"+des);
try {
//创建一个临时指定临时文件夹存放
DiskFileItemFactory temp=new DiskFileItemFactory(1000,new File("D:/file"));
//创建上传工具--接受客户端上传的文件
ServletFileUpload sfu=new ServletFileUpload(temp);
//通过上传工具对request中的数据进行处理
//因为用户提交的所有数据都是通过request提交,那么我们可以通过上传工具取到request中的所有数据,存放到一个集合中
List list=sfu.parseRequest(request);
//遍历集合,取到集合中文件或者字段
Iterator it= list.iterator();
while (it.hasNext()) {
FileItem fi = (FileItem) it.next();
//判断每一个条目是文件还是字段
if(fi.isFormField()){
//如果是一个字段,则取到字段名和字段值
String fileName=fi.getFieldName();
String fileValue=fi.getString("GBK");
System.out.println(fileName+"<><><><"+fileValue);
}else{
//如果不是字段,则表示fi是一个文件,我们需要获取文件的名字,然后把文件保存到指定的目录
String path=fi.getName();
String fileName=path.substring(path.lastIndexOf("\\")+1);
String savePath=getServletContext().getRealPath("/file/")+"/"+fileName;
fi.write(new File(savePath));
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
② SmartUpload上传:依赖于一个第三方架包SmartUpload.jar包
//创建解析工具
SmartUpload su = new SmartUpload();
//通过工具对request中的数据进行初始化
su.initialize(getServletConfig(), request, response);
//设置上传文件是限制信息:设置允许上传的单个文件的最大值,设置允许上传文件的类型
su.setMaxFileSize(1024*1024*10);
su.setAllowedFilesList("jpg,jpeg,bmp,gif,png");
//开始接收客户端的上传
su.upload();
//取到上传的所有文件(files相当于一个集合)
Files fs = su.getFiles();
//取到fs中文件的个数
for (int i = 0; i < fs.getCount(); i++) {
File f = fs.getFile(i);
String fName = f.getFileName();
//取到服务器上的files文件夹的路径
String savePath = getServletContext().getRealPath("/file")+"/"+fName;
f.saveAs(savePath);
}
//从su不能够直接取到字段,但是我们可以取到一个经过处理了的request对象
Request req = su.getRequest();
String des = req.getParameter("des");
System.out.println(des);
//上传成功之后跳转到列表页面,在列表页面中显示files文件夹中的所有文件
String path = getServletContext().getRealPath("/file");
java.io.File dir = new java.io.File(path);
String[] names = dir.list();
List<String> fileNames = new ArrayList<String>();
for (int i = 0; i < names.length; i++) {
fileNames.add(names[i]);
}
request.setAttribute("ns", fileNames);
request.getRequestDispatcher("list.jsp").forward(request, response);
文件下载:
//接受客户端需要下载的文件的文件名
String name=request.getParameter("fname");
String path=getServletContext().getRealPath("/file")+"/"+name;
InputStream is=new FileInputStream(path);
OutputStream os=response.getOutputStream();
response.setContentType("application/exe.pdf");
response.addHeader("Content-Disposition", "attachment;filename="+name);
byte[] b=new byte[500];
int len=-1;
while((len=is.read(b))!=-1){
os.write(b, 0, len);
os.flush();
}
os.close();
------------------------------------------------------------------------------------------------------------
package com.jsp.upload.servlet;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class JspUploadServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
String method = request.getParameter("method");
if ("upload".equals(method)) {
upload(request, response);
}
}
@SuppressWarnings("unchecked")
public void upload(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
File tempFile = null;
try {
// 创建一个临时指定临时文件夹存放,函数调用完应该将临时文件删除,这样能节约空间。
tempFile = new File("C:/file");
if (!tempFile.exists()) {
tempFile.mkdir();
}
DiskFileItemFactory temp = new DiskFileItemFactory(1000, tempFile);
// 创建上传工具--接受客户端上传的文件
ServletFileUpload sfu = new ServletFileUpload(temp);
// 通过上传工具对request中的数据进行处理
// 因为用户提交的所有数据都是通过request提交,那么我们可以通过上传工具取到request中的所有数据,存放到一个集合中
List list = sfu.parseRequest(request);
// 遍历集合,取到集合中文件或者字段
Iterator it = list.iterator();
while (it.hasNext()) {
FileItem fi = (FileItem) it.next();
// 判断每一个条目是文件还是字段
if (fi.isFormField()) {
// 如果是一个字段,则取到字段名和字段值
String fileName = fi.getFieldName();
String fileValue = fi.getString("GBK");
} else {
// 如果不是字段,则表示fi是一个文件,我们需要获取文件的名字,然后把文件保存到指定的目录
String path = fi.getName();
String fileName = path
.substring(path.lastIndexOf("\\") + 1);
String savePath = getServletContext().getRealPath("/file/");
File file = new File(savePath);
if (!file.exists()) {
file.mkdirs();
}
savePath = file.getPath() + "/" + fileName;
fi.write(new File(savePath));
fi.getOutputStream().close();
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
cycleDelFile(tempFile);
}
}
/**
* 获取指定格式的日期。
*
* @param date
* @return
*/
public static String dateFormat(Date date) {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd_hhmmss");
String time = format.format(date);
if (!isNull(time)) {
return time;
}
return null;
}
/**
* 文件重命名。
*
* @param filename
* @return
*/
public String renameFile(String filename) {
String fileExtendname = "";
if (null != filename && !"".equals(filename)) {
Date date = new Date();
int indexOfDot = filename.indexOf(".");
fileExtendname = filename.substring(indexOfDot + 1);
return dateFormat(date) + "." + fileExtendname;
}
return null;
}
/**
* 循环删除文件。
*
* @param file
*/
public void cycleDelFile(File file) {
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File fl : files) {
cycleDelFile(fl);
}
file.delete();
} else {
file.delete();
}
}
public static boolean isNull(String str) {
return "".equals(str) || null == str;
}
}
Jar:
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
commons-logging-1.0.4.jar
|