Nell'entity usa un array di byte:
@javax.persistence.Entity()
public class Publication extends EntityBase {
@NotBlank
private String description;
@NotBlank
private byte[] file;
public Publication() {
}
... get and set..
}
Nel controller bisogna definire il binding corretto per il tipo byte[]
definendo nel controller un metodo come il seguente:
@InitBinder
protected void initBinder(WebDataBinder binder) throws Exception {
binder.registerCustomEditor(byte[].class,
new ByteArrayMultipartFileEditor());
}
Il metodo save invece andava bene.
Il campo per il file nella JSP è banalmente:
<input type="file" name="publication.file"/>
(ma anche come hai fatto tu, con lo spring:bind, dovrebbe andare bene)
Ultima osservazione sulla dimensione dei file da uploadare. Di default
parancoe ha una configurazione con un limite ad 1MB. Se è necessario
permettere l'upload di file di dimensioni maggiori, occorre aggiungere
la seguente configurazione nel parancoe-servlet.xml:
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- the maximum file size in bytes -->
<property name="maxUploadSize" value="1000000"/>
</bean>
Ciao
Lucio
--
Lucio Benfante
JUG Padova http://www.parancoe.org ...have a look at it!
www.jugpadova.it http://www.jugevents.org
> mi visualizza cose del tipo:
>
> [B@1a0f6dd
[cut]
>
> suppongo sia la conversione in Unicode dei primi byte del file.
No, quello è la rappresentazione del reference all'oggetto array di bye.
Sostanzialmente quello che devi fare tu è spedire i byte sull'output
stream della risposta.
Crei un metodo nel tuo controller, ad esempio:
@RequestMapping
public void download(@RequestParam("id") Long id, HttpServletRequest
req,
HttpServletResponse res) throws Exception {
Publication publication = publicationDao.get(id);
OutputStream out = null;
try {
out = res.getOutputStream();
res.setContentType("application/pdf");
res.setContentLength(publication.getFile().length);
res.setHeader("Content-Disposition",
" attachment; filename=\"publication.pdf\"");
res.setHeader("Expires", "0");
res.setHeader("Cache-Control",
"must-revalidate, post-check=0, pre-check=0");
res.setHeader("Pragma", "public");
out.write(publication.getFile());
out.flush();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException ioe) {
}
}
}
}
Nell'esempio ipotizzo che siano PDF, se sono altro devi aggiustare il
ContentType e l'estensione di conseguenza.
Il link sarà qualcosa del tipo:
<a href="download.html?id=${publication.id}">download</a>