我想創建一個通用上傳代碼,它可以將所有數據,文本,圖像,視頻文件等插入blob字段,從相同的數據中檢索數據。我有 認爲將文件轉換爲字節,然後上傳它,並使用類似的方法下載它將工作。 有什麼比我更喜歡的是,儘管我能夠使用字節方法成功下載任何格式的文件,但通過將文件轉換爲字節上傳文件, 只能使用pdf和文本相關文檔。在上傳圖像文件或甚至xls文件時,我觀察到blob字段的字節大小比原始文件的字節大小更新(更新:不匹配)。下載後發現這些文件是不可讀的。在使用字節數組插入圖像,xls文件到blob時丟失字節和數據損壞
(我所遇到的過程中https://community.oracle.com/thread/1128742?tstart=0這將幫助我實現我想要的東西。但是,這將意味着我當前的代碼 相當重寫。我希望有一個出路在我當前的代碼本身。)
我 '插入到斑點' 代碼現在是:
表結構:
desc project_storage
Name Null Type
---------- ---- -------------
PROJECT_ID NUMBER(38)
FILE_NAME VARCHAR2(200)
DOCUMENTS BLOB
ALIAS VARCHAR2(50)
FILE_TYPE VARCHAR2(200)
代碼:
@RequestMapping(value="/insertProject.htm", method = { RequestMethod.POST}, headers="Accept=*/*")
public String insert(@RequestParam Map<String,Object> parameters,@RequestParam CommonsMultipartFile file,Model model,HttpServletRequest req){
try
{
log.info("Datasource || attempt to insert into project storage -Start()");
if(file!=null)
{
String file_type=file.getContentType();
String file_name=file.getOriginalFlename();
String file_storage=file.getStorageDescription();
long file_size=file.getSize();
System.out.println("File type is : "+file_type);
System.out.println("File name is :"+file_name);
System.out.println("File size is"+file_size);
System.out.println("Storage Description :"+file_storage);
ByteArrayOutputStream barr = new ByteArrayOutputStream();
ObjectOutputStream objOstream = new ObjectOutputStream(barr);
objOstream.writeObject(file);
objOstream.flush();
objOstream.close();
byte[] bArray = barr.toByteArray();
// byte [] bArray=file.getBytes();
// InputStream inputStream = new ByteArrayInputStream(bArray);
//inputStream.read();
Object objArray[]=new Object[]{file_name,bArray,parameters.get("alias"),file_type}; //bArray is our target.
int result=dbUtil.saveData("Insert into Project_Storage(Project_Id,File_Name,Documents,Alias,File_Type) values(to_number(?),?,?,?,?)", objArray);
model.addAttribute(result);
}
}
catch(Exception e){
System.out.println("Exception while inserting the documents"+e.toString());
e.printStackTrace();
}
log.info("Datasource || attempt to insert new project -end()");
return "admin/Result";
}
我哪裏錯了?當文件是xls,圖像或文件時,到底是什麼填充到blob字段?
編輯:嘗試上載一個虛設excel文件是如下:
The console output is as follows :
[6/29/15 20:28:41:803 IST] 0000004d SystemOut O File type is : application/octet-stream
[6/29/15 20:28:41:803 IST] 0000004d SystemOut O File name is :Game.xls
[6/29/15 20:28:41:804 IST] 0000004d SystemOut O File size is: 6144 //this is original size of file.
[6/29/15 20:28:41:804 IST] 0000004d SystemOut O Storage Description :in memory
[6/29/15 20:28:41:805 IST] 0000004d SystemOut O DBUtil || saveData || Query : Insert into Project_Storage(Project_Id,File_Name,Documents,Alias,File_Type) values(to_number(?),?,?,?,?)|| Object : [Ljava.lang.Object;@1eecbb7
[6/29/15 20:28:42:020 IST] 0000004d servlet I
下載的文件是大小6.7 KB的,幷包含數據如下:
由此可見這是數據損壞的問題。我以前認爲只有部分輸入數據發生。 編輯: - 正在通過表單讀取文件。
<span class="btn btn-default btn-file" id="btn_upload">
Browse <input type="file" name="file"></span>
我不熟悉java,但是我遇到過一次blob問題。檢查是否有任何這樣的答案可以幫助你:http://stackoverflow.com/questions/31030744/how-to-get-bmp-image-from-from-binary-blob-data-with-php – Clyff
@Clyff,I不要認爲這是一個大小/長度的限制..雖然我也是編程新手。然而,今天從你身上學到了一件新事物:-) –
爲什麼要保存在Blob中,或者就此而言,即使在DB中,也可以在數據庫中使用一個bytea並保存爲字節數組。優點是處理較少。您可以通過指定atBasic註釋並延遲加載來延遲加載bytea變量,因此不會總是獲取文檔。 –