Калитка - Как скачать файл через его поток?

У меня есть то, что, как я ожидаю, будет довольно распространенной задачей, но я нигде не могу найти прямых ответов, поэтому любая помощь здесь будет очень признательна.

Краткая версия: как я могу сделать IResourceStream из inputStream SmbFile?

Длинная версия: в моем приложении Wicket пользователи заполняют анкету, а затем загружают файл, как только они заполнили ее правильно. Файл находится на сервере Samba, поэтому я использую SmbFile, который отлично работает, так что с этим проблем нет. Я использую AJAXDownload, который был написан Свеном Мейером, Эрнесто Баррейро и Жорди Деу-Понсом, потому что мне нужно, чтобы моя кнопка имела функцию Ajax, чтобы проверить правильность заполнения формы, а затем начать загрузку. Когда я начинал с файла на своем компьютере, я мог просто использовать

final AJAXDownload download = new AJAXDownload()
        {
            @Override
            protected IResourceStream getResourceStream()
            {                   
                IResourceStream resStream = new FileResourceStream(file);

                return resStream;
            }
            @Override
            protected String getFileName() {
                return fileName;
            }
        };
        form.add(download);

Но теперь, когда я использую SmbFile через JCIFS, я не могу просто создать новый FileResourceStream. Я обнаружил, что могу использовать java.io.File.createTempFile для создания временного файла из inputStream smbFile, а затем использовать временный файл следующим образом:

protected IResourceStream getResourceStream()
            {                   
                java.io.File tempFile = null;
                try {
                    tempFile = File.createTempFile(smbFile.getName(), smbFile.getContentType());
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                try {
                    Files.writeTo(tempFile, smbFile.getInputStream());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                IResourceStream resStream = new FileResourceStream(tempFile);
                return resStream;
            }

И это отлично работает для небольших файлов, но у меня также будут довольно большие файлы, и, поскольку перед отправкой создается временная копия файла, это занимает очень много времени и является просто плохим дизайном. Любые идеи о том, как я могу загрузить свой smbFile в приложение wicket?

Редактировать: благодаря Joop Eggen и книге Kent Ka lok Tong «Наслаждаясь веб-разработкой с помощью Wicket», у меня есть решение ниже на случай, если кто-то еще окажется в подобной ситуации:

final AJAXDownload download = new AJAXDownload()
        {
            @Override
            protected IResourceStream getResourceStream()
            {                   
                IResourceStream resStream = new AbstractResourceStream() {
                    InputStream inStream;
                    public InputStream getInputStream() throws ResourceStreamNotFoundException{
                        try {
                            inStream = smbFile.getInputStream();
                        } catch (IOException e) {                               
                            e.printStackTrace();
                        }
                        return inStream;
                    }
                    public void close() throws IOException {
                        inStream.close();
                    }
                    public String getContentType() {
                        return smbFile.getContentType();
                    }
                };
                return resStream;
            }
            @Override
            protected String getFileName() {
                return smbFileName;
            }
        };
        form.add(download);

person brent_aof    schedule 19.11.2012    source источник


Ответы (1)


Вы должны получить SmbResourceStream, который расширяет AbstractResourceStream и реализовать предоставление InputStream для чтения, переопределив getInputStream и close. У вас уже есть smbFile.getInputStream().

person Joop Eggen    schedule 19.11.2012