我想创建一个通用上传代码,它可以将所有数据,文本,图像,视频文件等插入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变量,因此不会总是获取文档。 –