1,在pojo中使用byte[] 數組來進行保存blob對象
2,用apache fileupload來進行文件上傳操作
3,java 類獲取絕對路徑的方法
Class.class.getResource("/").toString(),這樣要用indexof獲取web-inf的位置,並將file:\這幾個前綴刪掉
Class.class.getResource("/").getPath(),前面沒有file前綴
4,在sql xml中添加typeHandler
<result property="image" column="IMAGE"
typeHandler="org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler" />
5,bytes to file 的方法
InputStream inputStream = new ByteArrayInputStream(image);
filePath = Action.class.getResource("/").getPath();
filePath = filePath + "/upload/" + user + ".jpg";
FileOutputStream out = new FileOutputStream(filePath);
byte[] b = new byte[1024*1024];
int length = 0;
while((length = inputStream.read(b)) != -1) {
out.write(b, 0, length);
}
out.close();
6,文件上傳
String realPath = getServletContext().getRealPaht("/Temp");
DiskFileItemFactory factory = new DisFileItemFactory(1024*1024, new File(readPath));
ServletFileUpload fileUpload = new ServletFileUpload(factory);
List<FIleItem> list = fileUpload.parseRequest(request);
for(FileItem fileItem : list) {
if(fileItem.isFormField()) {//普通表單項
String fieldName = fileItem.getFieldName();
String value = fileItem.getString("UTF-8");
} else {//上傳文件
String fieldName = fileItem.getFieldName();
InputStream in = fileItem.getInputStream();//從頁面獲取的文件
String path = getServletContext().getRealPath("");
FileOutputStream out = new FileOutputStream(path+"/uploadTemp/"+newFileName+".jpg");//將頁面上傳的文件存儲到服務器的文件夾上
byte[] b = new byte[1024*1024];
int length = 0;
while((length = in.read(b)) != -1) {
out.write(b, 0, length);
}
//將服務器上的這個文件轉換成byte數組
FileImageInputStream inFile = new FileImageInputStream(new File(path+"/uploadTemp/"+newFileName+".jpg"));
ByteArrayOutputStream byteArr = new ByteArrayOutputStream();
while((length = inFile.read(b)) != -1) {
byteArr(b, 0, length);
}
byte[] photo = byteArr.toByteArray();
//存儲數據庫,略
fileItem.delete();
in.close();
out.close();
終極方案:當使用spring定時器時,request和ServletContext無法獲取,可以用下面的辦法直接獲取ServletContext:
ContextLoader.getCurrentWebApplicationContext().getServletContext();
在George項目中的使用總結:
讀寫文件的時候可能需要獲得路徑,比如上傳文件的時候就需要輸出流。而通過ServletContext不可以直接獲得輸出流的,但可以直接獲取文件的實際路徑。如:
servletContext.getRealPath("/");
這樣獲得的路徑是${context}/的路徑,可以依據子路徑和文件名稱拼接獲取輸出流