У меня есть то, что, как я ожидаю, будет довольно распространенной задачей, но я нигде не могу найти прямых ответов, поэтому любая помощь здесь будет очень признательна.
Краткая версия: как я могу сделать 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);