將Excel檔案匯入資料庫(POI+Excel+MySQL+jsp頁面匯入)第一次優化
本篇文章是根據我的上篇部落格,給出的改進版,由於時間有限,僅做了一個簡單的優化。
相關文章:將excel匯入資料庫
2018年4月1日,新增下載地址連結:點選開啟原始碼下載地址
十分抱歉,這個連結地址沒有在這篇文章上公佈出來。希望不是很晚。
上篇文章的是這樣的一個資料流向:
瀏覽器端開啟上傳頁面,選擇檔案,上傳,將excel上傳到伺服器,在伺服器生成一個excel的檔案,並寫入Excel,再把excel檔案讀取存入mysql。
這一次做的優化是,可以再上傳後,不再在excel中寫入資料,也可以將檔案寫死,不會再在伺服器佔用空間。少了一步寫入和讀取的操作。直接對io流解析儲存。
工程還是上篇文章的資源。
Upload.java
package com.app.action;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.adtec.framework.common.util.JsonUtil;
import com.app.excel.InputToFile;
import com.app.excel.ReadExl_1;
import com.app.excel.SaveData2DB;
import com.app.po.Student_1;
import net.sf.json.JSONObject;
public class UpLoad extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("coming.......");
//得到上傳檔案的儲存目錄,將上傳的檔案存放於WEB-INF目錄下,不允許外界直接訪問,保證上傳檔案的安全
String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
//上傳時生成的臨時檔案儲存目錄
String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");//"/WEB-INF/temp"
File tmpFile = new File(tempPath);
if (!tmpFile.exists()) {
//建立臨時目錄
tmpFile.mkdir();
}
//訊息提示
String message = "";
try{
//使用Apache檔案上傳元件處理檔案上傳步驟:
//1、建立一個DiskFileItemFactory工廠
DiskFileItemFactory factory = new DiskFileItemFactory();
//設定工廠的緩衝區的大小,當上傳的檔案大小超過緩衝區的大小時,就會生成一個臨時檔案存放到指定的臨時目錄當中。
factory.setSizeThreshold(1024*100);//設定緩衝區的大小為100KB,如果不指定,那麼緩衝區的大小預設是10KB
//設定上傳時生成的臨時檔案的儲存目錄
factory.setRepository(tmpFile);
//2、建立一個檔案上傳解析器
ServletFileUpload upload = new ServletFileUpload(factory);
//監聽檔案上傳進度
/*upload.setProgressListener(new ProgressListener(){
public void update(long pBytesRead, long pContentLength, int arg2) {
System.out.println("檔案大小為:" + pContentLength + ",當前已處理:" + pBytesRead);
}
});*/
//解決上傳檔名的中文亂碼
upload.setHeaderEncoding("UTF-8");
//3、判斷提交上來的資料是否是上傳表單的資料
if(!ServletFileUpload.isMultipartContent(request)){
//按照傳統方式獲取資料
return;
}
//設定上傳單個檔案的大小的最大值,目前是設定為1024*1024位元組,也就是1MB
upload.setFileSizeMax(1024*1024);
//設定上傳檔案總量的最大值,最大值=同時上傳的多個檔案的大小的最大值的和,目前設定為10MB
upload.setSizeMax(1024*1024*10);
//4、使用ServletFileUpload解析器解析上傳資料,解析結果返回的是一個List<FileItem>集合,每一個FileItem對應一個Form表單的輸入項
List<FileItem> list = upload.parseRequest(request);
for(FileItem item : list){
//如果fileitem中封裝的是普通輸入項的資料
if(item.isFormField()){
String name = item.getFieldName();
//解決普通輸入項的資料的中文亂碼問題
String value = item.getString("UTF-8");
// String value = item.getString("gbk");
//value = new String(value.getBytes("iso8859-1"),"UTF-8");
System.out.println(name + "=" + value);
}else{//如果fileitem中封裝的是上傳檔案
//得到上傳的檔名稱,
String filename = item.getName();
System.out.println(filename+"..");
if(filename==null || filename.trim().equals("")){
continue;
}
//注意:不同的瀏覽器提交的檔名是不一樣的,有些瀏覽器提交上來的檔名是帶有路徑的,如: c:\a\b\1.txt,而有些只是單純的檔名,如:1.txt
//處理獲取到的上傳檔案的檔名的路徑部分,只保留檔名部分
filename = filename.substring(filename.lastIndexOf("\\")+1);
//得到上傳檔案的副檔名
String fileExtName = filename.substring(filename.lastIndexOf(".")+1);
//如果需要限制上傳的檔案型別,那麼可以通過檔案的副檔名來判斷上傳的檔案型別是否合法
System.out.println("上傳的檔案的副檔名是:"+fileExtName);
//獲取item中的上傳檔案的輸入流
InputStream in = item.getInputStream();
//得到檔案儲存的名稱
String saveFilename = makeFileName(filename);
//得到檔案的儲存目錄
String realSavePath = makePath(saveFilename, savePath);
//////////////////////////修改的程式碼/////////////////////////////////////////
File file = new File(realSavePath + "\\" + saveFilename);
InputToFile itf = new InputToFile();
file = itf.inputstreamtofile(in, file);
SaveData2DB saveData2DB = new SaveData2DB();
saveData2DB.save(file);
///////////////////////////////////////////////////////////////////////////
}
//關閉輸入流
in.close();
//關閉輸出流
out.close();
//刪除處理檔案上傳時生成的臨時檔案
//item.delete();
// SaveData2DB saveData2DB = new SaveData2DB();
// saveData2DB.save(realSavePath + "\\" + saveFilename);
System.out.println("end");
message = "success";
}
}
}catch (FileUploadBase.FileSizeLimitExceededException e) {
e.printStackTrace();
message = "單個檔案超出最大值!!!";
/*request.setAttribute("message", "單個檔案超出最大值!!!");*/
/* request.getRequestDispatcher("/message.jsp").forward(request, response);*/
return;
}catch (FileUploadBase.SizeLimitExceededException e) {
e.printStackTrace();
message = "上傳檔案的總的大小超出限制的最大值!!!";
/*request.setAttribute("message", "上傳檔案的總的大小超出限制的最大值!!!");*/
/*request.getRequestDispatcher("/message.jsp").forward(request, response);*/
return;
}catch (Exception e) {
message= "檔案上傳失敗!";
e.printStackTrace();
}
/*request.setAttribute("message",message);*/
returnResultJson(response,message);
/*request.getRequestDispatcher("/message.jsp").forward(request, response);*/
}
private String makeFileName(String filename){ //2.jpg
//為防止檔案覆蓋的現象發生,要為上傳檔案產生一個唯一的檔名
return UUID.randomUUID().toString() + "_" + filename;
}
private String makePath(String filename,String savePath){
//得到檔名的hashCode的值,得到的就是filename這個字串物件在記憶體中的地址
int hashcode = filename.hashCode();
int dir1 = hashcode&0xf; //0--15
int dir2 = (hashcode&0xf0)>>4; //0-15
//構造新的儲存目錄
String dir = savePath + "\\" + dir1 + "\\" + dir2; //upload\2\3 upload\3\5
//File既可以代表檔案也可以代表目錄
File file = new File(dir);
//如果目錄不存在
if(!file.exists()){
//建立目錄
file.mkdirs();
}
return dir;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
private void returnResultJson(HttpServletResponse response,Object obj) {
PrintWriter pw = null;
try {
pw = response.getWriter();
JSONObject resultmessage = JsonUtil.generate(obj);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
response.setHeader("Cache-Control", "no-cache");
pw.write(resultmessage.toString());
} catch (Exception e) {
pw.write("系統異常,請聯絡管理員");
} finally {
pw.flush();
pw.close();
}
}
}
第二步,在excel包內建立一個新的類InputToFile.java
package com.app.excel;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class InputToFile {
public File inputstreamtofile(InputStream ins,File file){
try {
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return file;
}
}
以上就是優化的所有操作了。抓緊試試吧。
相關文章
- 將excel表格匯入資料庫Excel資料庫
- 匯入excel檔案Excel
- excel 匯入sqlyog資料庫ExcelSQL資料庫
- 如何用Java將excel資料匯入資料庫JavaExcel資料庫
- php讀取excel檔案資料的匯入和匯出PHPExcel
- TP5.1excel匯入資料庫的程式碼?php excel如何匯入資料庫?Excel資料庫PHP
- java怎麼將excel表格資料匯入資料庫JavaExcel資料庫
- PHP 匯入資料庫 sql 檔案PHP資料庫SQL
- 資料庫遠端檔案匯入資料庫
- 將XML匯入資料庫XML資料庫
- 匯入excel資源到資料庫Excel資料庫
- EasyExcel完成excel檔案的匯入匯出Excel
- Java POI匯入Excel檔案JavaExcel
- Oracle 巧用外部表將大量excel資料匯入資料庫OracleExcel資料庫
- pl/sql developer將excel資料匯入到資料庫中SQLDeveloperExcel資料庫
- [Docker核心之容器、資料庫檔案的匯入匯出、容器映象的匯入匯出]Docker資料庫
- java 從EXCEL匯入到資料庫JavaExcel資料庫
- 從Excel到匯入MYSQL資料庫ExcelMySql資料庫
- Excel匯入Sqlserver資料庫指令碼ExcelSQLServer資料庫指令碼
- Excel 表匯入資料Excel
- Oracle 資料匯入ExcelOracleExcel
- Net.Core匯入EXCel檔案裡的資料Excel
- java程式碼實現excel檔案資料匯入JavaExcel
- EasyPoi, Excel資料的匯入匯出Excel
- excel檔案中的資料匯入Oracle資料庫的幾種方法ExcelOracle資料庫
- MYSQL資料檔案匯入MySql
- 如何使用JavaScript匯入和匯出Excel檔案JavaScriptExcel
- MATLAB匯入txt和excel檔案技巧彙總:批量匯入、單個匯入MatlabExcel
- mysql匯入文字或excel檔案MySqlExcel
- MySQL 批量匯入資料優化MySql優化
- 原生PHP網頁匯出和匯入excel檔案例項PHP網頁Excel
- Oracle工具之sqlldr的使用--如何將文字檔案或Excel中的資料匯入資料庫OracleSQLExcel資料庫
- 將informix匯出的文字資料匯入oracle資料庫ORMOracle資料庫
- excel檔案內容匯入資料庫的問題及解決Excel資料庫
- PHP大資料xlswriter匯入匯出(最優資料化)PHP大資料
- 教你如何將二進位制檔案匯入到資料庫資料庫
- NCF 如何匯入Excel資料Excel
- 匯入excel 資料時間Excel