This content has been marked as final.
Show 4 replies
-
1. Re: open a file from a server location
cash1981 Aug 3, 2009 4:07 PM (in response to laxmiram)The best practise is to have the files in the database.
If you do, you can call a method from your view:public void download(Long fileId) throws IOException, EntityNotFoundException { File f = entityManager.find(File.class, fileId); if (f == null) { throw new EntityNotFoundException(); } download(f); }
Then you can serve the file back to the client
public void download(File file) throws IOException { byte[] data = file.getData(); HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); //Take mime type from filename, I don't know if the null check is necessary, the API doesn't say. String mime = fileNameMap.getContentTypeFor(file.getName()); if (mime == null || "".equals(mime.trim())) { mime = "application/octet-stream"; } response.setContentType(mime); response.addHeader("Content-Disposition", "attachment;filename=" + file.getName()); response.setContentLength(data.length); OutputStream writer = response.getOutputStream(); writer.write(data); writer.flush(); writer.close(); FacesContext.getCurrentInstance().responseComplete(); }
Hope this helps
-
2. Re: open a file from a server location
laxmiram Aug 4, 2009 12:31 PM (in response to laxmiram)thanks that you had helped me to proceed with a way.
i started this way...
in db:
create directory DIR1 as 'd:\data'
create table filetable(id number(6),filename bfile)
insert into filetable values (1,bfilename('DIR1','filename'));
so having this set up.
i created the entity for filetable.
now wen i tried the way that you had suggested, i am struck with the start up.
1. byte[] data = file.getData();
i dont fine getData() function with file.
2. String mime = fileNameMap.getContentTypeFor(file.getName());
fileNameMap... canu tel me what is this.
am with very basic knowledge about this. so pardon me if i had missed any setup that i had to do.
do kindly guide me. -
3. Re: open a file from a server location
cash1981 Aug 4, 2009 12:40 PM (in response to laxmiram)First you need to make sure you table is byte.
Here is how my File table looks like:
import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.Date; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.PrePersist; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; import org.hibernate.validator.NotNull; @Entity public class File { @Id @GeneratedValue private Long id; @NotNull @Column(nullable=false,length=256) private String name; //BLOB = L + 2 bytes (max size is 2^16 - 1 or 65,535 bytes, 65KB) //MEDIUMBLOB = L + 3 bytes (max size is 2^24 - 1 or 16,777,215 bytes, 16MB) //LONGBLOB = L + 4 bytes (max size is 2^32 - 1 or 4,294,967,295 bytes, 4GB) @Basic(fetch = FetchType.LAZY) //@Basic is used in conjunction with @Lob @Lob //Set to MAX 100MB MEDIUMBLOB in MySQL @Column(length=1024721500, nullable=false) private byte[] data; @Temporal(TemporalType.TIMESTAMP) private Date date; @PrePersist //@PreUpdate - otherwise the create date will always be the same as the emailed date public void setDate() { date = new Date(); } @Transient public InputStream getInputStream() { return new ByteArrayInputStream(data); } //getter & setter }
I have a postconstruct that initiliaze the fileNameMap like this:
@PostConstruct public void contruct() { fileNameMap = URLConnection.getFileNameMap(); }
So file.getData() will retrieve the file.
java.net.FileNameMap
You need this so that the browser can show the file. You can read more about mimetypes by googling. -
4. Re: open a file from a server location
laxmiram Aug 4, 2009 2:20 PM (in response to laxmiram):-(
i didn't store the file in db as blob, instead i had created that as
bfile
should i step for change?
or is there a way that i can continue with existing set up?