struts2上传文件到oracle数据库中,要求文件内容要以BLOB形式保存在数据库中 请看完补充说明再回答,谢谢

保存BLOB到数据库那步我知道怎么做,众所周知strut2 上传时,中间文件是保存在一个XX.temp文件里的 但是我企图用inputstream(XX.temp) 读入byte[]而后再来写数据库,却发现读入的是一个堆不知所云的内容,形如下面
PK....方块......ContentType....乱码一堆

怎么才能得到文件的实际内容,不是字符问题,因为文件内容没有中文全是数字而已
我上传的是个XX.docx文件 用的tomcat6.0+jdk1.6+eclipse 开发
急,全部分奉上谢谢!
下面是图片说明:调试过程中发现读到的临时文件是乱码
把XX.temp文件改名为xx.docx 可以打开并看到正确内容是1111111111

blob里面是字节流,你这样直接看肯定是乱码.
就像你用记事本打开word文件一样.
你把流读出来后,重命名,保存到本地.
也就是说你上传的时候,需要把上传文件的文件名和后缀名保存在库里面.
下载的时候再把文件名和后缀名还原.这样就可以了.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-07
Struts中实现文件上传比Struts1简化了不少:
给你个例子:
页面:
<s:form action ="file-upload" method ="POST" enctype ="multipart/form-data">
<s:file name ="upload" label ="请选择要上传的文件" />
<s:textfield name ="caption" label ="上传后的新文件名" />
<s:submit/>
</s:form>

Action代码:
package com.app.core.web.struts2.test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;

import org.apache.commons.lang.StringUtils;

import com.opensymphony.xwork2.ActionSupport;

/**
* 单文件上传实例Action.
*
* @author
*/
// 定义URL映射对应/test/file-upload.do,默认名称空间即为/test
// @Namespace("/test")
public class FileUploadAction extends ActionSupport {

private static final long serialVersionUID = -2606203995427981093L;

private static final int BUFFER_SIZE = 16 * 1024;

private File upload; // 上传的文件
private String contentType; // 上传的文件的类型
private String fileName; // 上传的文件的文件名,不包含路径信息
private String caption; // 上传页面中手工设置的文件名

public void setUploadContentType(String contentType) {
this.contentType = contentType;
}

public void setUploadFileName(String fileName) {
this.fileName = fileName;
}

public void setUpload(File upload) {
this.upload = upload;
}

public String getCaption() {
if (StringUtils.isBlank(this.caption) && StringUtils.isNotBlank(this.fileName))
this.caption = this.fileName + new Date().getTime();
return caption;
}

public void setCaption(String caption) {
this.caption = caption;
}

@Override
public String execute() {
if (StringUtils.isNotBlank(fileName)) {
System.out.println("上传文件的类型为:" + this.contentType);
String newFileName = getCaption() + getExtention(fileName);
// File saveFile = new File(ServletActionContext.getServletContext().getRealPath("/UploadImages") + "/" + newFileName);
File saveFile = new File("D:/java/myeclipse_ws/UploadImages/" + newFileName);
copy(upload, saveFile);
}
return SUCCESS;
}

/**
* 将源文件复制到目标文件
* @param src
* @param dst
*/
private static void copy(File src, File dst) {
try {
InputStream in = null;
OutputStream out = null;
try {
in = new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE);
out = new BufferedOutputStream(new FileOutputStream(dst), BUFFER_SIZE);
byte[] buffer = new byte[BUFFER_SIZE];
while (in.read(buffer) > 0) {
out.write(buffer);
}
} finally {
if (null != in) {
in.close();
}
if (null != out) {
out.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 解析出上传文件的扩展名
* @param fileName
* @return
*/
private static String getExtention(String fileName) {
int pos = fileName.lastIndexOf(".");
return fileName.substring(pos);
}

}
第2个回答  2011-11-07
用流读取数据,其类型是String的,然后转成byte(二进制),然后对数据以BLOB形式进行解析,解析完后就可以存入数据库了。
大致思路应该这样,一定要搞懂“BLOB”是什么,怎么存取……具体的以BLOB形式来存入数据库,我也没有做过,你试试