我有一个Web应用程序,用户需要上传.zip文件.在服务器端,我正在检查上传文件的mime类型,以确保它是application/x-zip-compressed或application/zip.
在Firefox和IE上,这对我来说很好.然而,当一个同事测试它时,它在Firefox上失败了(发送mime类型就像是" application/octet-stream")但是在Internet Explorer上工作.我们的设置似乎是相同的:IE8,FF 3.5.1禁用所有附加组件,Win XP SP3,WinRAR安装为本机.zip文件处理程序(不确定是否相关).
所以我的问题是:浏览器如何确定要发送的mime类型?
请注意:我知道mime类型是由浏览器发送的,因此不可靠.我只是检查它是为了方便 - 主要是为了给出一个比你通过尝试打开非zip文件作为zip文件获得的更友好的错误消息,并避免加载(可能是沉重的)zip文件库.
我需要下载存储在数据库中的文件.我想我做了正确的查询并调用它我只是不知道如何将它连接到JSF页面中的按钮.另外我想知道,在将它传递到JSF页面之前,我是否必须将该图像保存在服务器的文件夹中.如果是这样,我该怎么做?
这是我用来从db返回byte []的查询:
@NamedQuery(name = "downloadGarbage", query = "SELECT g.file FROM Garbage g WHERE g.id :idParam")
@Entity
public class Garbage implements Serializable {
@Lob
@Column(nullable = false)
private byte[] file;
....
Run Code Online (Sandbox Code Playgroud)
这是一个简单的EJB,它调用该查询然后获取id:
@Stateless(name = "ejbs/FileDownloaderEJB")
public class FileDownloaderEJB implements IFileDownloaderEJB {
@PersistenceContext
private EntityManager em;
public byte[] downloadGarbage(Long id) {
Query query = em.createNamedQuery("downloadGarbage");
query.setParameter("idParam", id);
Object o = query.getSingleResult();
byte[] tmpArray = (byte[]) o;
return tmpArray;
}
Run Code Online (Sandbox Code Playgroud)
现在这是困扰我的部分,我在JSF页面和托管bean上面怎么样?
@ManagedBean
@RequestScoped
public class DownloadController {
@EJB
private FileDownloaderEJB fileDownloaderEJB;
... …Run Code Online (Sandbox Code Playgroud) 使用Java servlet,是否可以检测文件的真实文件类型,无论其扩展名如何?
场景:您只允许纯文本文件上传(.txt和.csv)用户获取文件mypicture.jpg,将其重命名为mypicture.txt并继续上传文件.你的servlet只需要文本文件,并试图读取jpg.
显然这是用户错误,但有没有办法检测到它不是纯文本而不是继续?