我正在导入 Excel 文档以在 UI 中阅读和显示内容。我需要知道如何获取使用浏览上传的文件的路径,以便读取 excel 文件的内容。
3 回答
我需要知道如何获取使用浏览上传的文件的路径,以便读取 excel 文件的内容。
这里有一个重大的思维错误。
想象一下,我是想要上传文件的客户端,而您是需要获取文件内容的服务器。我给你路径c:\path\to\foo.xls
作为唯一的信息。作为服务器,您将如何获得其内容?您是否与我的本地硬盘文件系统建立了开放的 TCP/IP 连接?真的吗?拥有所有敏感信息的其他人的本地磁盘文件系统真的那么容易通过 Internet 访问吗?
这不是上传文件的工作方式。这只有在服务器与客户端在物理上运行在同一台机器上时才有效,这样您就可以使用FileInputStream
该路径(这只发生在本地开发环境中)。
相反,您应该对客户端与 HTTP 请求正文一起发送给您的唯一文件内容感兴趣。在 HTML 术语中,您可以使用<input type="file">
它。但在即将到来的 JSF 2.2 之前,还没有与之等效的标准 JSF<h:xxx>
组件。您需要寻找为此提供组件的 JSF 组件库。在您的情况下,使用 RichFaces(如您的问题中标记的那样),您可以使用<rich:fileUpload>
它。目前尚不清楚您使用的是哪个 RichFaces 版本,但对于 RF 3.3.3,您可以在3.3.3 展示站点中找到完整示例,对于 RF 4.0,您可以在4.0 展示站点中找到。
无论您选择哪种方式,您都应该在您的 JSF 托管 bean 中最终以 abyte[]
或 aInputStream
表示文件内容。然后,您可以自由地将其存储在服务器的本地磁盘文件系统上的任何位置,例如FileOutputStream
. 您甚至可以直接将它提供给您正在使用的任何 Excel API,它们中的大多数只有一个采用InputStream
or的方法byte[]
。
你最好看看这篇文章。BalusC使用 Tomahawk 2.0 ( http://myfaces.apache.org/tomahawk-project/tomahawk20/index.html ) 的解决方案很棒
你需要的一切都在那里
String fileName = FilenameUtils.getName(uploadedFile.getName());
byte[] bytes = uploadedFile.getBytes();
FileOutputStream outputStream = null;
try {
String filePath = System.getProperty("java.io.tmpdir") + "" + fileName;
outputStream = new FileOutputStream(new File(filePath));
outputStream.write(bytes);
outputStream.close();
readExcelFile(filePath);
} catch (Exception ex) {
}
In the above code Iam uploading the file using tomahawk after uploading storing the file in a temporary location.And from there i will be reading using poi.
public static void readExcelFile(String fileName)
{
try{
FileInputStream myInput = new FileInputStream(fileName);
POIFSFileSystem myFileSystem = new POIFSFileSystem(myInput);
org.apache.poi.ss.usermodel.Workbook workbook = WorkbookFactory.create(myFileSystem);
org.apache.poi.ss.usermodel.Sheet sheet = workbook.getSheetAt(0);
Iterator rowIter = sheet.rowIterator();
for(Row row : sheet) {
//u can read the file contents by iterating.
}
} catch (Exception ex) {
}
}