Java實現文件上傳代碼
依賴2個jar包:commons-fileupload,commons-io。
代碼如下:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
public class FileUpload extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
//指定文件存放目錄
String storePath=getServletContext().getRealPath("WEB-INF/files");
File file=new File(storePath);
//如果目錄不存在,需要創建
if(!file.exists()){
file.mkdirs();
}
//要檢查是不是enctype=multipart/form-data提交過來的數據
boolean isMultipart=ServletFileUpload.isMultipartContent(request);
//如果不是,需要處理
if(!isMultipart){
out.write("請將enctype設置成multipart/form-data類型");
response.setHeader("Refresh", "1;URL="+request.getContextPath());
return;
}
//去生成一個文件上傳的FileUpload對象
DiskFileItemFactory factory=new DiskFileItemFactory();
//設置一個臨時目錄
//factory.setRepository(new File("E:/temp"));temp文件需要臨時創建,我已經刪掉了
ServletFileUpload upload=new ServletFileUpload(factory);
//將用戶的請求轉化為List
try {
List items=upload.parseRequest(request);
//遍歷List中的數據
for (FileItem item : items) {
//如果部分文件沒有上傳
if("".equals(item.getName())){
continue;
}
//判斷是普通字段
if(item.isFormField()){
String fieldName=item.getFieldName();
String fieldValue=item.getString("UTF-8");
System.out.println(fieldName+":"+fieldValue);
}else{
//是上傳的文件
//需要獲取文件名,有可能是路徑
String fileName=item.getName();
fileName=fileName.substring(fileName.lastIndexOf(File.separator)+1);
//文件名同名問題
fileName=UUID.randomUUID().toString()+"_"+fileName;
//解決一個文件夾下的文件過多的問題
//用時間來生成子目錄
//String childPath=generateDir(storePath);
//用hashcode來生成子目錄
String childPath=generateDir(storePath,fileName);
//獲取上傳文件的數據
InputStream is=item.getInputStream();
OutputStream os=new FileOutputStream(storePath+File.separator+childPath+File.separator+fileName);
IOUtils.copy(is, os);
os.close();
is.close();
//item.delete();//清空臨時文件
}
}
out.write("文件上傳成功繼續上傳");
} catch (FileUploadException e) {
e.printStackTrace();
}
}
private String generateDir(String storePath, String fileName) {
int hashcode=fileName.hashCode();
int dir1=hashcode & 0xf;
int dir2=(hashcode & 0xf0)>>4;
String childPath=dir1+File.separator+dir2;
File file=new File(storePath,childPath);
if(!file.exists()){
file.mkdirs();
}
return childPath;
}
private String generateDir(String storePath) {
DateFormat df=new SimpleDateFormat("yyyyMMddhhmmss");
String childPath=df.format(new Date());
File file=new File(storePath, childPath);
if(!file.exists()){
file.mkdirs();
}
return childPath;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
本文由用戶 open代碼123 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!