我一直在开发一个读取Excel文件的函数,并将其数据输入到数据库中。 Excel文件由输入文件(HTML)中的最终用户选择。当我单击提交按钮时,Controller(Java)正常接收文件名,但是,当我尝试将上传的文件放入InputStream来读取文件数据并对其进行处理时,我得到以下异常: “java.io.FileNotFoundException:”文件名“(Osistemanãopodeencontrar o caminho especificado)”
我已经工作了3天了,直到现在,我在谷歌都找不到答案。
控制器方法代码
@Post
public void pegaArquivoMetas(HttpSession session, UploadedFile planilha) throws IOException, BiffException {
InputStream inp = new FileInputStream(planilha.getFileName());
try{
Workbook workbook = Workbook.getWorkbook(inp);
}catch(BiffException e){
e.printStackTrace();
}
}
JSP表单代码
<form enctype="multipart/form-data" method="post" action="${linkTo[MonitorController].pegaArquivoMetas}" >
<div class="col-lg-6">
<label for="txtArquivo"></label>
<input type="file" accept=".xls,.xlsx" name="planilha" class="form-control" id="txtArquivo" />
</div>
<div class="col-lg-2">
<label for="btnAtualizar"></label>
<button type="submit" id="btnAtualizar" class="btn btn-success btn-block disabled"><i class="fa fa-refresh"></i> Atualizar</button>
</div>
</form>
我试图在Controller上添加更多代码,但是,我在“InputStream inp”的同一行得到了错误。
如果你们需要更多信息,请不要犹豫。
答案 0 :(得分:0)
这里有点猜测,因为我没有对vraptor做太多,但假设你正在使用这个界面: https://github.com/caelum/vraptor/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/interceptor/multipart/UploadedFile.java
然后您应该使用planilha.getFile()
直接获取InputStream
。 getFileName()
仅在上传人员的计算机上引用上传文件的“简单名称”。您只应将该值用于显示目的。
答案 1 :(得分:0)
最有可能的,因为您实际上没有磁盘上的文件,而是UploadedFile对象。尝试使用
try (InputStream is = planilha.getInputStream()) {
Workbook workbook = Workbook.getWorkbook(inp);
} catch (BiffException e) {
e.printStackTrace();
}
因为应该为您提供一个可以使用的InputStream。
答案 2 :(得分:0)
我发现了发生了什么。
没有必要将UploadedFile抛出到InputStream中。将UploadFile直接放入工作簿对象是可能的,也是必要的。
因此,Controller代码如下:
public void pegaArquivoMetas(HttpSession session, UploadedFile planilha) throws IOException, BiffException {
Workbook wb;
try{
wb = Workbook.getWorkbook(planilha.getFile());
Sheet sh = wb.getSheet(0);
int linhas = sh.getRows();
}catch (BiffException e) {
e.printStackTrace();
}
}
非常感谢,伙计们!!!