报表中心FineReport中文件如何上传到指定路径
的有关信息介绍如下:在使用文件上传控件时,希望将文件上传放到某个固定的位置下并且就将上传的文件名提交入库,此时要如何实现呢?下面通过报表中心FineReport来简单介绍一下。
编写自定义函数
Commit3.java源文件代码具体如下:
package com.fr.data;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.*;
import com.fr.base.FRContext;
import com.fr.base.Formula;
import com.fr.cache.Attachment;
import com.fr.data.ClassSubmitJob;
import com.fr.data.SubmitJob;
import com.fr.data.impl.SubmitJobValue;
import com.fr.general.FArray;
import com.fr.general.FRLogManager;
import com.fr.general.FRLogger;
import com.fr.script.Calculator;
import com.fr.stable.UtilEvalError;
import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLableReader;
public class Commit3 implements SubmitJob {
private Object attach;
private SubmitJobValue filePath; //定义文件路径
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public void doJob(Calculator ca) throws Exception {
FRContext.getLogger().info("begin to upload file...");
final Object attachO = attach;
if (attachO instanceof FArray && ((FArray) attachO).length() != 0) {
new Thread() {
public void run() {
int i;
FArray attachmentlist = (FArray) attachO;
for (i = 0; i < attachmentlist.length(); i++) {
if (!(attachmentlist.elementAt(i) instanceof Attachment)) {
continue;
} else {
FRContext.getLogger().info("filePath.value:" + filePath.getValue().toString());
FRContext.getLogger().info("filePath.valueState:" + filePath.getValueState() +
"注:valueState 0,1,2,3 分别表示 默认值,插入行,值改变,删除行");
String FilePath = filePath.getValue().toString();
String FileName = ((Attachment) (attachmentlist.elementAt(i))).getFilename();
String Path = FilePath + "\\" + FileName;
File fileDir = new File(FilePath);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
try {
mkfile(FilePath, FileName, new java.io.ByteArrayInputStream(
((Attachment) (attachmentlist.elementAt(i))).getBytes())); //新建文件夹,并且写入内
} catch (Exception e) {
Logger.getLogger("FR").log(Level.WARNING,
e.getMessage() + "/nmkfileerror", e);
}
}
}
}
}.start();
}
}
private static void mkfile(String path, String FileName,
java.io.InputStream source) throws FileNotFoundException,
IOException {
File fileout = new File(path, FileName);
if (fileout.exists()) {// 检查是否存在
fileout.delete();// 删除文件
FRContext.getLogger().info("old file deleted");
}
// 在当前目录下建立一个名为FileName的文件
if(fileout.createNewFile()) {
FRContext.getLogger().info(path + FileName + "created!!");
}
FileOutputStream outputStream = new FileOutputStream(fileout);
byte[] bytes = new byte;
int read=source.read(bytes);
while (read!=-1) {
outputStream.write(bytes, 0, read);
outputStream.flush();
read = source.read(bytes);
}
outputStream.close(); //把source写入新建的文件
}
public void readXML(XMLableReader reader) {
// TODO Auto-generated method stub
}
public void writeXML(XMLPrintWriter writer) {
}
@Override
public void doFinish(Calculator arg0) throws Exception {
// TODO Auto-generated method stub
}
}
编译自定义函数
将编译后的Commit3.class和Commit3$1.class放在FineReport的安装目录WEB-INF下面的classes目录下,由于Commit3.java属于包com.fr.data,因此Commit3.class和Commit3$1.class需要放置在classes\com\fr\data目录下。
定义模板
表样设置
按照下图设置表样:
A1单元格的控件类型为文件上传控件,控件名为attach;B1单元格的控件类型为按钮,按钮名字为上传,点击该按钮时,将文件上传;C1单元格的控件类型为文本框,获取上传文件名称,使用公式filename(A1);在D1单元格中输入文件要上传的路径,控件设置为不可见。
自定义函数调用及入库处理
给B1按钮增加个点击事件,选择提交入库,进行如下图设置:
设置后,点击设置提交事件按钮,然后增加自定义提交事件,点击“+”按钮,选择自定义事件,然后选择com\fr\data\commit3.class,点击增加属性按钮,添加2个属性,名字分别为attach和filePath(与commit3.java中定义的文件路径名相同),值选择分别为公式A1和单元格D1,其效果如下图:
注:由于attach在Commit3.java中定义的是object对象,所以其属性值只能是公式F(x)=A1,不能选择单元格,然后输入A1,而filePath在Commit3.java中定义的是SubmitJobValue,所以其属性值类型只能是单元格,然后选择具体对应的哪个单元格,如上图的形式,不能写公式。
预览
点击填报预览,点击文件上传控件,选择完文件后,点击上传文件按钮即可将对应的文件上传到指定的目录下了。