【问题标题】:converting my files to blob then inserting to database将我的文件转换为 blob 然后插入到数据库
【发布时间】:2015-11-13 14:55:35
【问题描述】:

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

我在动作类上使用这个代码

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: cannot cast java.io.File to java.sql.Blob...

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

请帮忙,谢谢大家

【问题讨论】:

    标签: java jsp liferay blob


    【解决方案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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 不幸的是我没有在这个项目中使用preparedstatement,我正在使用liferay,有点类似于struts,如果我错了,请纠正我哈哈......它被称为Service Builder......它基于冬眠和春天
      • 数据库中的字段是Blob数据类型,我可以在Blob字段中插入字节数组吗?
      • 我为 Blob 对象编辑了答案。您应该能够在 DB 的 Blob 字段中插入一个 byte[]。
      • 我这样做了,但我得到错误 // 序列化为字节数组 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ObjectOutput out1 = new ObjectOutputStream(outputStream); out1.writeObject(文件); out1.close(); // 获取序列化对象的字节数 byte[] fileArray = outputStream.toByteArray(); return Blob.setBytes(0, fileArray);
      • 抱歉,我不知道代码无法在 cmets 格式化
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 2011-05-16
      • 1970-01-01
      • 2011-06-27
      相关资源
      最近更新 更多