小例子
上傳:
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);
}