java.io.FileNotFoundException Загруженный файл InputStream

Я разрабатываю функцию, которая читает файл Excel и вводит его данные в базу данных. Файл Excel выбирается конечным пользователем во входном файле (HTML). Когда я нажимаю кнопку отправки, контроллер (Java) обычно получает имя файла, но когда я пытаюсь поместить загруженный файл в InputStream для чтения данных файла и работы с ним, я получаю следующее исключение: «java. io.FileNotFoundException: "Имя файла" (система не может быть введена или указана отдельно)"

Я работаю над этим в течение 3 дней, и до сих пор я не получил ответа на этот вопрос в Google.

Код метода контроллера

@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>

Я попытался добавить еще немного кода в контроллер, но получил ошибку в той же строке «InputStream inp».

Если вам, ребята, нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать.


person Felipe    schedule 10.01.2017    source источник


Ответы (3)


Здесь немного предположений, поскольку я мало что делал с 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() относится только к «простому имени» загруженного файла на компьютере загружающего человека. Вы должны использовать это значение только для целей отображения.

person Florian Albrecht    schedule 10.01.2017
comment
Да, Флориан, я использовал этот интерфейс и попытался поместить planilha.getFile() в InputStream, и это было проблемой. Когда мы используем multipart/form-data, нам не нужно создавать файл в локальном каталоге, потому что файл уже существует в памяти, и это то, что я пытался сделать.... - person Felipe; 10.01.2017

Скорее всего, так как у вас на самом деле не файл на диске, а объект UploadedFile. Попробуйте использовать

try (InputStream is = planilha.getInputStream()) {
  Workbook workbook = Workbook.getWorkbook(inp);
} catch (BiffException e) {
    e.printStackTrace();
}

так как это должно дать вам InputStream для работы.

person Stefan Helmerichs    schedule 10.01.2017

Я узнал, что происходит.

Не нужно было выбрасывать UploadedFile в InputStream. Было возможно и необходимо напрямую поместить файл UploadFile в объект рабочей книги.

Итак, код контроллера выглядит так:

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();
    }
}

спасибо большое,ребята!!!

person Felipe    schedule 10.01.2017
comment
не принято отвечать на свой вопрос, если кто-то уже дал правильный ответ. Вместо этого вы должны пометить правильный ответ как принятый, нажав серую галочку рядом с ответом. - person Florian Albrecht; 11.01.2017