小例子
上传:
public class FileUpUtils {
/**
* 获取文件的真实名称
*/
public static String getRealName(String fileName) {
int index = fileName.lastIndexOf("\\") + 1;
return fileName.substring(index);
}
/**
* 获取随机名称
*/
public static String getUUIDFileName(String fileName) {
int index = fileName.lastIndexOf(".");
if (index != -1) {
//文件没有后缀名,只返回名字
return UUID.randomUUID().toString() + fileName.substring(index);
} else {
//文件有后缀名,返回随即名字加后缀名
return UUID.randomUUID().toString();
}
}
/**
* 目录分离算法,例子只写三层
*/
public static String getRandomDirectory(String fileName){
int hashcode = fileName.hashCode();
int a = hashcode & 0xf;
hashcode = hashcode >>> 4;
int b = hashcode & 0xf;
hashcode = hashcode >>> 4;
int c = hashcode & 0xf;
return "/" + a + "/" + b + "/" + c;
}
}
public class UpLoad5 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
boolean flag = upload.isMultipartContent(request);
if (flag) {
response.getWriter().write("是文件上传");
upload.setHeaderEncoding("utf-8");
try {
List<FileItem> item = upload.parseRequest(request);
for (FileItem items : item) {
if (!items.isFormField()) {
//上传文件名称
String name = items.getName();
//文件名字
String fileName = FileUpUtils.getRealName(name);
//随机名字
String uuidName = FileUpUtils.getUUIDFileName(fileName);
//随机目录
String randomDirectory = FileUpUtils.getRandomDirectory(fileName);
String path = this.getServletContext().getRealPath("/upload");
File f = new File(path , randomDirectory);
if(!f.exists()){
f.mkdirs();
}
InputStream in = items.getInputStream();
FileOutputStream fos = new FileOutputStream(new File(f , uuidName));
name.substring(name.lastIndexOf("\\") + 1);
IOUtils.copy(in, fos);
fos.close();
in.close();
//删除临时文件
items.delete();
}
}
} catch (FileUploadException e) {
response.getWriter().write(e.getMessage());
return;
}
} else {
System.out.println("不是文件上传操作");
return;
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
下载:
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("下载资源不存在.");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}