1.创建文件读取的对象
DiskFileUpload fu = new DiskFileUpload();
注:
DiskFileUpload
是 Apache Commons FileUpload 库中的一个类,它用于处理文件上传。然而,在最新版本的 Apache Commons FileUpload 库中,DiskFileUpload
已经被废弃,不再推荐使用。取而代之的是使用DiskFileItemFactory
。
2.获取当前应用的真实路径
String path = application.getRealPath("").replace('\\','/');
if(!path.endsWith("/")){
path += "/";
}
注:
application.getRealPath(""):获取 Web 应用的根目录的绝对路径。例如,如果应用部署在
C:\Tomcat\webapps\myapp
下,这将返回C:\Tomcat\webapps\myapp
。
.replace('\\', '/')
: 将路径中的所有反斜杠替换为正斜杠path.endsWith("/"):检查
path
字符串是否以/
字符结尾。如果是,返回true
;否则,返回false
。
3.配置文件上传时的内存和磁盘存储策略
// 设置允许用户上传文件大小,单位:字节
fu.setSizeMax(10000000);
// maximum size that will be stored in memory?
// 设置最多只允许在内存中存储的数据,单位:字节
fu.setSizeThreshold(4096);
// 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
fu.setRepositoryPath(path+"/upload");
fu.setSizeMax(10000000);
- 功能: 设置允许上传的最大文件大小为 10,000,000 字节(约 10 MB)。超过这个大小的文件将被拒绝。
fu.setSizeThreshold(4096);
- 功能: 设置在内存中存储的最大数据量为 4,096 字节(4 KB)。如果上传的文件大小超过这个阈值,文件将不再完全存储在内存中,而是开始写入临时文件。
fu.setRepositoryPath(path + "/upload");
- 功能: 指定当文件大小超过
setSizeThreshold
设置时,数据应存储的目录路径。文件将被保存到这个目录中,避免占用过多的内存。作用:
这些设置帮助平衡内存和磁盘使用:
- 小文件将完全存储在内存中,提高性能。
- 大文件将在超过阈值后转储到磁盘,防止过度占用内存。
- 设置最大上传大小确保了系统的稳定性和安全性。
4.处理上传的文件
List fileItems = null;
try{
/**
*fu.parseRequest(request)是用来处理文件上传请求并解析请求中的文件和表单字段的代码。这段代码通常出现在 Java 的文件上传处理逻辑中,特别是在使用 Apache Commons FileUpload 库时。
*/
fileItems = fu.parseRequest(request);
}catch(FileUploadException e){
System.out.println("------------------:"+e);
}
//作用: 声明两个字符串变量 ImportPath 和 FileName,分别用于存储上传文件的路径和文件名。
String ImportPath = "";
String FileName = "";
// 依次处理每个上传的文件
//迭代器迭代集合
//作用: 获取 fileItems 列表的迭代器,以便遍历每个 FileItem 对象
Iterator iter = fileItems.iterator();
while (iter.hasNext())
{
//作用: 遍历 fileItems 列表中的每个 FileItem 对象。
//FileItem item = (FileItem) iter.next();: 获取下一个 FileItem 对象,并进行类型转换。
FileItem item = (FileItem) iter.next();
//作用: 检查 FileItem 对象的字段名是否为 "ImportPath"。
if (item.getFieldName().compareTo("ImportPath")==0)
{
//如果是,则处理这个字段(通常这是一个普通表单字段)。
//ImportPath = item.getString();: 将字段值存储在 ImportPath 中,并打印出来。
ImportPath = item.getString();
System.out.println("上传路径:"+ImportPath);
}
//忽略其他不是文件域的所有表单信息
//item.isFormField()作用: 检查 FileItem 对象是否代表一个文件(即不是普通表单字段)。
//如果是文件,则执行文件处理逻辑。
if (!item.isFormField())
{
//获取上传文件的原始文件名。
String name = item.getName();
System.out.println(name);
//获取上传文件的大小
long size = item.getSize();
//如果文件名为空,文件大小为0,结束当次循环,执行下一个
if((name==null||name.equals("")) && size==0)
continue;
//设置文件保存的路径
ImportPath= path + "upload/";
//将文件名中的反斜杠替换为正斜杠。
FileName = name.replace('\\','/');
//获取文件名的基本名称(去掉路径部分)
FileName = FileName.substring(FileName.lastIndexOf("/") + 1);
//保存上传的文件到指定的目录
//作用: 尝试将上传的文件写入指定路径,并捕获可能发生的异常。
try
{
// 使用 FileItem 的 write 方法将文件保存到 ImportPath + FileName 位置。
item.write(new File(ImportPath + FileName));
System.out.println("======ImportPath + FileName======" + ImportPath + FileName);
count = 1;
}
catch(Exception e){
System.out.println("upload file error ...");
}
}
}
处理文件上传请求并解析请求中的文件和表单字段的代码。这段代码通常出现在 Java 的文件上传处理逻辑中
解析
fu.parseRequest(request)
:
- 功能: 这个方法用于解析传入的
HttpServletRequest
对象,并返回一个List
对象,其中包含了所有上传的文件和表单字段。- 参数:
request
是一个HttpServletRequest
对象,代表客户端提交的 HTTP 请求。
List fileItems
:
- 类型:
fileItems
是一个List
对象,包含了FileItem
对象。每个FileItem
对象代表了一个上传的文件或一个表单字段。- 作用: 你可以通过这个列表来遍历每个上传的文件和表单字段,并进行相应的处理。
- try-catch(){}
- 作用: 尝试解析文件上传请求,并捕获
FileUploadException
异常。
5.数据传递
//将文件名,文件路径,和参数封装到tVData,并将tVData传递给逻辑处理层
tTransferData.setNameAndValue("FileName",FileName);
tTransferData.setNameAndValue("FilePath", path);
tTransferData.setNameAndValue("Xxx", Xxx);
tVData.add(tTransferData);
xxxximport.submitData(tVData,"");
6.读取文件内容
1.导包
import com.f1j.ss.BookModelImpl;
导入.jar包:
f1j9swing.jar
,之后导包com.f1j.ss.BookModelImpl;,用于操作Excel文件
2.生成对象
private BookModelImpl m_book = new BookModelImpl();
3.读取文件
//在使用 f1jss 库读取 Excel 文件
// mImportFileName:文件路径
//new com.f1j.ss.ReadParams()读取文件时的参数设置
m_book.read(mImportFileName, new com.f1j.ss.ReadParams());
4.获取指定sheet的最大行数
String sValue = m_book.getText(iSheet, iRow, 0);
解析:m_book.getText(iSheet, iRow, 0)
作用:获取一个sheet页,第iRow行的第一个单元格的内容
iSheet:代表第几个sheet页,计数时从0开始,0代表第一个sheet页
iRow:代表第几行,计数时从0开始,0代表第一行
最后一位;代表第几列,计数时从0开始,0代表第一个单元格
通过这三个参数可以确定,第几个sheet页的,第几个单元格,获取单元格里的值
private int getMaxRow(int iSheet)
{
String sValue = "";
String sValue01 = "";
String sValue02 = "";
String sValue03 = "";
String sValue04 = "";
String sValue05 = "";
String sValue06 = "";
int iRow;
for (iRow = 0; iRow < 1000000; iRow++)
{
try
{
sValue = m_book.getText(iSheet, iRow, 0);
sValue01 = m_book.getText(iSheet, iRow, 1);
sValue02 = m_book.getText(iSheet, iRow, 2);
sValue03 = m_book.getText(iSheet, iRow, 3);
sValue04 = m_book.getText(iSheet, iRow, 4);
sValue05 = m_book.getText(iSheet, iRow, 5);
sValue06 = m_book.getText(iSheet, iRow, 6);
}
catch (Exception ex)
{
CError.buildErr(this, "数据读取错误!");
return -1;
}
if ((sValue == null || sValue.trim().equals(""))&&(sValue01 == null || sValue01.trim().equals(""))&&(sValue02 == null || sValue02.trim().equals(""))&&(sValue03 == null || sValue03.trim().equals(""))&&(sValue04 == null || sValue04.trim().equals(""))&&(sValue05 == null || sValue05.trim().equals(""))&&(sValue06 == null || sValue06.trim().equals("")) )
{
break;
}
}
System.out.println("最大行数iRow:"+iRow);
return iRow;
}
该Excel中有7列,获取一整行的单元格的值,若所有的单元格为空则代表,这一个行为空,表示这个sheet页中的内容结束,break结束循环,获得最大行数
5.组装获取的值
for (int iRow = 1; iRow < iMaxRow; iRow++) //逐行
{
String sValue[]=new String[7];
LLcqnegativedataSchema tLLcqnegativedataSchema = new LLcqnegativedataSchema();
for (int iCol = 1; iCol <=7; iCol++) //逐列
{
System.out.println("正在导入的是第'"+0+"'个SHEET的第'"+iRow+"'行中的第'"+iCol+"'列");
try
{
sValue[iCol-1] = m_book.getText(0, iRow, iCol-1);
}
catch (Exception ex)
{
CError.buildErr(this, "数据读取错误!");
}
}
//对每一个字段进行校验
。。。
。。。
//将这条数据存入数据库
。。。。
。。。。
}
根据获取的最大行数,重新进行遍历,获取当前行的内容
将每一个单元格的值取出,存放到一个数组中
对数组中的每一位的值进行校验是否符合规范
一个数组存一行数据,对应数据库的一个行
注:可能不适用所有的Excel导入