檔案的上傳與下載程式碼
阿新 • • 發佈:2019-02-14
檔案上傳程式碼
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.UUID;
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.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;
public class UploadServlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// request.setCharacterEncoding("UTF-8");
// 要執行檔案上傳的操作
// 判斷表單是否支援檔案上傳。即:enctype="multipart/form-data"
boolean isMultipartContent = ServletFileUpload
.isMultipartContent(request);
if (!isMultipartContent) {
throw new RuntimeException("your form is not multipart/form-data");
}
// 建立一個DiskFileItemfactory工廠類
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File("f:\\"));// 指定臨時檔案的儲存目錄
// 建立一個ServletFileUpload核心物件
ServletFileUpload sfu = new ServletFileUpload(factory);
// 解決上傳表單項亂碼問題
sfu.setHeaderEncoding("UTF-8");
// 限制上傳檔案的大小
// 解析request物件,並得到一個表單項的集合
try {
// sfu.setFileSizeMax(1024*1024*3);//表示3M大小
List<FileItem> fileItems = sfu.parseRequest(request);
// 遍歷表單項資料
for (FileItem fileitem : fileItems) {
if (fileitem.isFormField()) {
// 普通表單項
processFormField(fileitem);
} else {
// 上傳表單項
processUploadField(fileitem);
}
}
} catch (FileUploadBase.FileSizeLimitExceededException e) {
// throw new RuntimeException("檔案過在,不能超過3M");
System.out.println("檔案過在,不能超過3M");
} catch (FileUploadBase.SizeLimitExceededException e) {
System.out.println("總檔案大小不能超過6M");
} catch (FileUploadException e) {
e.printStackTrace();
}
}
private void processUploadField(FileItem fileitem) {
try {
// 得到檔案輸入流
InputStream is = fileitem.getInputStream();
// 建立一個檔案存檔的目錄
String directoryRealPath = this.getServletContext().getRealPath(
"/WEB-INF/upload");
File storeDirectory = new File(directoryRealPath);// 即代表檔案又代表目錄
if (!storeDirectory.exists()) {
storeDirectory.mkdirs();// 建立一個指定的目錄
}
// 得到上傳的名子
String filename = fileitem.getName();// 檔案項中的值 F:\**\**\
if (filename != null) {
// filename =
// filename.substring(filename.lastIndexOf(File.separator)+1);
filename = FilenameUtils.getName(filename);// 效果同上
}
// 解決檔案同名的問題
filename = UUID.randomUUID() + "_" + filename;
// 目錄打散
// String childDirectory = makeChildDirectory(storeDirectory); //
// 2015-10-19
String childDirectory = makeChildDirectory(storeDirectory, filename); // a/b
// 上傳檔案,自動刪除臨時檔案
fileitem.write(new File(storeDirectory, childDirectory
+ File.separator + filename));
fileitem.delete();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// 上傳表單項
private void processUploadField1(FileItem fileitem) {
try {
// 得到檔案輸入流
InputStream is = fileitem.getInputStream();
// 建立一個檔案存檔的目錄
String directoryRealPath = this.getServletContext().getRealPath(
"/WEB-INF/upload");
File storeDirectory = new File(directoryRealPath);// 即代表檔案又代表目錄
if (!storeDirectory.exists()) {
storeDirectory.mkdirs();// 建立一個指定的目錄
}
// 得到上傳的名子
String filename = fileitem.getName();//
// 處理檔名
/*
* 解決此問題: F:\\apache-tomcat-7.0.52\\webapps\\**\\upload\\F:\\**
*/
if (filename != null) {
// filename =
// filename.substring(filename.lastIndexOf(File.separator)+1);
filename = FilenameUtils.getName(filename);// 效果同上
}
// 解決檔案同名的問題
filename = UUID.randomUUID() + "_" + filename;
// 目錄打散
// String childDirectory = makeChildDirectory(storeDirectory); //
// 2015-10-19
String childDirectory = makeChildDirectory(storeDirectory, filename); // 2015-10-19
// 在storeDirectory下,建立完整目錄下的檔案
File file = new File(storeDirectory, childDirectory
+ File.separator + filename); // 絕對目錄/日期目錄/檔名
// 通過檔案輸出流將上傳的檔案儲存到磁碟
FileOutputStream fos = new FileOutputStream(file);
int len = 0;
byte[] b = new byte[1024];
while ((len = is.read(b)) != -1) {
fos.write(b, 0, len);
}
//關閉流
fos.close();
is.close();
fileitem.delete();
} catch (IOException e) {
e.printStackTrace();
}
}
// 目錄打散
private String makeChildDirectory(File storeDirectory, String filename) {
int hashcode = filename.hashCode();// 返回字元轉換的32位hashcode碼
System.out.println(hashcode);
String code = Integer.toHexString(hashcode); // 把hashcode轉換為16進位制的字元
// abdsaf2131safsd
System.out.println(code);
String childDirectory = code.charAt(0) + File.separator
+ code.charAt(1); // a/b
// 建立指定目錄
File file = new File(storeDirectory, childDirectory);
if (!file.exists()) {
file.mkdirs();
}
return childDirectory;
}
// 按日期打散
/*
* private String makeChildDirectory(File storeDirectory) {
*
* SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd"); String
* dateDirectory = sdf.format(new Date()); //只管建立目錄 File file = new
* File(storeDirectory,dateDirectory); if(!file.exists()){ file.mkdirs(); }
*
* return dateDirectory; }
*/
// 普通表單項
private void processFormField(FileItem fileitem) {
try {
String fieldname = fileitem.getFieldName();// 欄位名
String fieldvalue = fileitem.getString("UTF-8");// 欄位值
//fieldvalue = new String(fieldvalue.getBytes("iso-8859-1"),"utf-8");
System.out.println(fieldname + "=" + fieldvalue);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
檔案上傳注意問題
- 設定上傳檔案的大小問題;
- 判斷上傳檔案型別,如果是可執行檔案等是非常危險的;
- 如果系統較大,上傳的檔案比較多,注意要多分一下目錄(按時間等),解決可能上傳檔案同名情況,以及上傳檔案的儲存路徑
- 注意設定編碼問題,form表單中要有上傳的屬性,才能上傳。
檔案下載程式碼
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//設定一個要下載的檔案
String filename = "電器";
//設定檔名的編碼
if(request.getHeader("user-agent").toLowerCase().contains("msie")){
filename = URLEncoder.encode(filename, "UTF-8");//將不安全的檔名改為UTF-8格式
}else{
filename = new String(filename.getBytes("UTF-8"),"iso-8859-1");//火狐瀏覽器
}
//告知瀏覽器要下載檔案
response.setHeader("content-disposition", "attachment;filename="+filename);
//response.setHeader("content-type", "image/jpeg");
response.setContentType(this.getServletContext().getMimeType(filename));//根據檔名自動獲得檔案型別
response.setCharacterEncoding("UTF-8");//告知伺服器使用什麼編碼
//建立一個檔案輸出流
PrintWriter out = response.getWriter();
out.write("電視機,20\n");
out.write("洗衣機,10\n");
out.write("冰箱,8\n");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}