0

场景:我正在尝试使用 JExcel 读取 excel 文件并将数据转储到 Oracle 数据库中。我要求用户浏览并选择要从他们的系统中读取的文件,然后我读取该文件并将数据(不保存物理文件)转储到 Oracle 数据库中。

<form id='uploadform'>
    <table class='detailTable'>
    <tr>
        <td class='detailTableTD'>Select File to Upload:</td>
        <td class='detailTableTD'>
            <input type='file' id='fileUpload'>
        </td>
    </tr>
    <tr>
        <td class='detailTableTD'></td>
        <td class='detailTableTD'>
            <button id='uploadBtn' onclick="upload();">Upload</button>
            <button id='backBtn'>Back</button>                                  
        </td>
    </tr>
    </table>
</form>

爪哇:

public int[][] readFromExcel(final String excelFilePath) throws ApplicationException {
    String excelPath = excelFilePath.trim();
    File inputWorkbook = new File(excelPath);
    Workbook workbook;
    MyObj drawBk;
    List drBkLst = new ArrayList();
    String tmpStr = "";
    try {
        workbook = Workbook.getWorkbook(inputWorkbook);
        Sheet sheet = workbook.getSheet(0);
        for (int j = 1; j < sheet.getRows(); j++) {
            drawBk = new MyObj();
            for (int i = 0; i < sheet.getColumns(); i++) {
                Cell cell = sheet.getCell(i, j);
                switch (i) {
                case 0:
                    drawBk.setSerialNumber(cell.getContents());
                    break;
                case 1:
                    drawBk.setMediaNumber(cell.getContents());
                    break;
                case 2:
                    tmpStr = cell.getContents();
                    if (!(tmpStr.trim().equalsIgnoreCase("Y") || tmpStr.trim().equalsIgnoreCase("N")))
                        continue;
                    else
                        drawBk.setMnProcessInd(tmpStr);
                    drawBk.setSnProcessInd(tmpStr);
                    break;
                }
            }
            drawBk.setLastChangedUser(userId);
            drBkLst.add(drawBk);
        }
    } catch (Exception readExcelEx) {}
return insertExcelDataToDatabase(drBkLst);
}

在这里,我捕获路径并作为参数传递给用于处理单元格的 Java 方法,并创建要插入 DB 的对象的 ArrayList。这里所有的简单代码。从本地部署运行时一切正常,但是当我将 EAR 部署到服务器时,当我浏览文件并选择文件时,我开始收到 FileNotFound 异常。我觉得这一切都是由于一些相对/绝对路径问题,但不可能调试,我需要它快。任何精确的帮助将不胜感激?

谢谢。

4

2 回答 2

1

我相信当您在本地运行时,该文件驻留在本地系统上,因此您不会遇到任何异常。但是当你在服务器上部署它时,用户浏览的文件仍然在他的机器上,直到服务器才到达。您需要创建一个临时文件或从文件的请求参数二进制数据中读取java对象中的数据。

于 2012-10-31T10:47:52.717 回答
1

您必须将文件写入服务器上的某个临时目录。您不能使用来自服务器 (ear) 的系统文件路径。

您必须将表单更改为多部分并处理请求。查看此链接 (http://www.servletworld.com/servlet-tutorials/servlet-file-upload-example.html)。

您也可以避免将文件写入 temp (无论如何它将由 java 用 tmp 写入,但您不必提供路径)。采用

FileInputStream fis = new FileInputStream(new File()); //after reading it using file io.
Workbook workbook = WorkbookFactory.create(fis);  
于 2012-10-31T10:57:16.090 回答