将我的文件转换为blob然后插入数据库

时间:2015-08-20 05:31:55

标签: java jsp liferay blob

我在通过操作类插入上传的文件时遇到问题。

我在动作类

上使用此代码
UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(actionRequest);
/*  Upload NBI  */
File nbi = null;
File nbiFile = getThisFile(uploadRequest, "nbiFile", nbi);

它正在调用此方法来获取文件

public File getThisFile(UploadPortletRequest uploadRequest, String filename, File file){
InputStream[] inputStream;
try {
    inputStream = uploadRequest.getFilesAsStream(filename);
    for(InputStream fileObj:inputStream){
        file = FileUtil.createTempFile(fileObj);
    }
} catch (IOException e) {
    e.printStackTrace();
}
return file;
}

然后将文件转换为blob,我认为..

/*  Convert files to blob  */
Blob blobNbi = Blob.class.cast(nbiFile);

然后我应该可以保存它

/*  Attachment Object Properties  */
long attachment_id = CounterLocalServiceUtil.increment();
attachments a = null;
a = attachmentsLocalServiceUtil.createattachments((int) attachment_id);
a.setNbi_clearance(blobNbi);

/*  Save the data to table  */
a = attachmentsLocalServiceUtil.addattachments(a);

但是当我运行它时,我得到ClassCastException:无法将java.io.File转换为java.sql.Blob ...

我的转换有什么问题,我试图找到从文件到blob的直接转换,但对我来说没有任何作用,也许我需要先将其转换为其他内容然后blob?

请帮助,谢谢你们

2 个答案:

答案 0 :(得分:1)

因为我正在使用Liferay将我的文件插入到数据库中..我使用了以下代码,看来Liferay创建了一个名为'OutputBlob'的对象来处理blob对象..这里是代码

/*  Get file from jsp  */
UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(actionRequest);
File file = uploadRequest.getFile("XXX", true); // XXX is the input name from my jsp
FileInputStream fileInput = new FileInputSream(file);
OutputBlob blobOutput = new OutputBlob(fileInput, file.length());

/*  Attachment Object Properties  */
long attachment_id = CounterLocalServiceUtil.increment();
attachments a = null;
a = attachmentsLocalServiceUtil.createattachments((int) attachment_id);
a.setNbi_clearance(blobOutput);

/*  Save the data to table  */
a = attachmentsLocalServiceUtil.addattachments(a);

那里,这就解决了我的问题,记住它只适用于liferay上传,OutputBlob对象不是在Liferay以外的任何其他平台/语言/框架上制作的...感谢帮助人员, 我希望那些有关liferay上传问题的人看到这个:D

答案 1 :(得分:0)

我认为演员不会奏效。 Blob由字节组成,因此您需要将文件内容读入byte []并使用java.sql.Blob.setBytes(long, byte[]) - Blob方法。由于它是一个接口,如果你真的需要一个Blob-Object,那么类javax.sql.rowset.serial.SerialBlob可能会对你有帮助。

如果您使用PreparedStatement,则可以先使用java.sql.PreparedStatement.setBlob(int, InputStream)而不使用byte []。 如果您使用JPA / Hibernate afaik,它应该能够使用byte []。