Het uploaden van bestanden is vaak een niet-triviale taak. Eerst moet je het bestand worden gevalideerd op type en grootte, naar een tijdelijke bestemming worden gestreamed en daarna gekopieerd, wat nu al simpeler klinkt dan het is als je het zelf moet doen.
Met RichFaces wordt het echter een stuk simpeler, een oplossing die ik jullie niet wilde onthouden.
De component:
Met de <rich:fileUpload> tag plaats je de component. In mijn geval ziet het er als volgt uit:
<rich:fileUpload maxFilesQuantity="1"
immediateUpload="true" onsizerejected="alert('Uw bestand mag niet groter dan 1000KB zijn');"
ontyperejected="alert('Alleen *.jpg, *.gif, *.png en *.bmp bestanden zijn toegestaan als plaatje');"
acceptedTypes="jpg, gif, png, bmp"
fileUploadListener="#{bean.upload}">
</rich:fileUpload>
Dit creëert een upload-component dat één plaatje accepteert en het meteen upload na het selecteren. Als het groter is dan 1000KB (te configureren als maxRequestSize init-param bij het rich-faces filter in web.xml) of als niet voldoet aan de bestandtype-eis, dan geeft dit component netjes een melding. De listener verwijst naar een specifiek event in de achterliggende bean.
public void upload(UploadEvent event) throws IOException {
UploadItem item = event.getUploadItem();
String filePath = //path waar het bestand naar toe moet
File file = new File(filePath);
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
// In de web.xml is ook weer configureren of er tijdelijke bestanden worden
// gemaakt of dat alleen het geheugen wordt gebruikt. Standaard wordt er
// gebruik gemaakt van tijdelijke bestanden.
//<init-param>
// <param-name>createTempFiles</param-name>
// <param-value>true</param-value>
//</init-param>
if (item.isTempFile()) {
FileInputStream fis = new FileInputStream(item.getFile());
IOUtils.write(IOUtils.toByteArray(fis), fos);
fis.close();
} else {
IOUtils.write(item.getData(), fos);
}
fos.close();
}
Merk op dat ik bij deze code ook de IOUtils uit Apache Commons gebruik om de bestandsafhandeling aanzienlijk te vereenvoudigen.
Hiermee is het bestand geupload, inclusief nette afhandeling van eventuele fouten. Bedankt RichFaces!