我正在编写一个Web应用程序,我希望能够将csv文件从jsp导入数据库。以前我使用以下代码将csv插入数据库。
LOAD DATA LOCAL INFILE "/myFileLocation.csv"
INTO TABLE myTable
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
当我在本地拥有该文件时,哪个效果很好。
我的问题,当我将jsp中的csv文件作为multipart上传时。我可以将该PartItem文件作为变量传递,并将“/myFileLocation.csv”替换为PartItem文件的临时位置吗?
我可以在调试时查看临时位置,并查看位于变量表下的存储库/路径中的PartItem文件。这是完全可以访问还是我需要解析csv并将其插入到数据库中?
答案 0 :(得分:0)
我最终找到了一种方法来完成这项工作。不确定它是否是最佳解决方案,但它的工作正如我所设想的那样。基本上我创建了一个字符串,指向我在web / resources中创建的资产文件夹。
final String mainPath = this.getServletContext().getRealPath("resources/assets");
然后我读取上传的文件,检查我的资产文件夹中是否已存在该文件,如果是,我将其删除。
Part filePart = request.getPart("csvFile");
String path = mainPath + "/" + filePart.getSubmittedFileName();
File fileTemp = new File(path);
if(fileTemp.exists()){
fileTemp.delete();
}
最后,我阅读了上传的文件,并在我指示的位置写了一个新文件,在这种情况下,我创建的资产文件夹是这样的。
final String fileName = filePart.getSubmittedFileName();
File convFile = new File(filePart.getSubmittedFileName());
FileOutputStream fos = new FileOutputStream(convFile);
OutputStream out = null;
InputStream filecontent= null;
try{
out = new FileOutputStream(new File(mainPath + File.separator + fileName));
filecontent = filePart.getInputStream();
int read = 0;
final byte[] bytes = new byte[1024];
while((read = filecontent.read(bytes)) != -1){
out.write(bytes, 0, read);
}
} catch (FileNotFoundException fne) {
} finally {
if (out != null) {
out.close();
}
if (filecontent != null) {
filecontent.close();
}
}
之后,我只是将包含文件路径的字符串传递给我创建的DAO,在那里我可以使用上面发布的sql语句。
就像我之前说的那样,不确定这是否是最好的方法,但它似乎对我很好,我的jsp中没有包含任何java代码。如果有人有更好的方法做到这一点或者看到我在这里做的事情有问题让我知道,我很有兴趣听到它。