我想在Struts2应用程序中的数据库中插入图像;
我正在使用三个班级:
在JSP中我使用s:file
标记。
我的问题是:我需要使用哪种类型的模型类私有变量?
在数据库中,我使用blob type
来存储图像,是不是?如果没有,请给我建议。
如何使用Srtuts2在数据库中插入图像?
答案 0 :(得分:4)
要将文件上传到Struts2
,您已使用Struts2 FileUpload Interceptor
,只需在动作或模型类中定义这些字段
public class UploadAction extends ActionSupport {
private File file;
private String contentType;
private String filename;
public void setUpload(File file) {
this.file = file;
}
public void setUploadContentType(String contentType) {
this.contentType = contentType;
}
public void setUploadFileName(String filename) {
this.filename = filename;
}
public String execute() {
//...
return SUCCESS;
}
}
您可以通过
之类的内容将File
数据转换为byteArray
IOUtils.toByteArray(InputStream input);
并可以通过类似
的方式将其保存为数据库中的Blob
Blob blob = connection.createBlob();
blob.setBytes(1, bytes);
答案 1 :(得分:1)
使用fileUpload
拦截器,当您提交包含File
标签的表单和能够传输到服务器的值数据时,您可以将<s:file
对象放入您的操作中。如果您的上传成功,则您可以从本地商店读取服务器上的数据,即java.io.tempdir
可用于设置本地商店的位置。然后你需要阅读文件的内容
File file; //this is uploaded file
FileInputStream is = new FileInputStream(file);
byte[] data = new byte[is.available()];
is.read(data);
is.close();
然后你可以使用java.sql.Blob
或java.sql.Clob
类型来编写数据以保存在数据库中,类型应该对应于数据库字段类型,即blob用于blob,CLOB用于clobs等。您从db中再次检索数据,将使用相同的java sql类型将数据转换回来。现在问题是,如果要将该值保留在要用数据库数据填充的模型中,有两个选项:
java.sql.Blob
byte[]
对于第二个选择,您需要byte[] data = getBytes(File file)
之类的内容来打开流并从文件中读取数据,或者如果您有Blob
,则使用blob.getBytes(pos, length)
。
在您处理流的第一个选择中,使用Blob setBinaryStream(pos)
来获取输出流以写入上载的文件数据,或使用getBinaryStream()
从数据库中检索数据。
在大多数情况下,您应该使用第二种选择,直到您有足够的理由使用第一种选择。