Servlets 服务器上Struts的文件上载问题

Servlets 服务器上Struts的文件上载问题,servlets,file-upload,struts2,zip,Servlets,File Upload,Struts2,Zip,我正在尝试创建一个上载servlet,用于处理来自表单的enctype=“multipart/form data”。我试图上传的文件是zip文件。但是,我可以在localhost上上载和读取文件,但是当我上载到服务器时,当我想要上载文件时,会出现“未找到文件”错误。这是因为我使用的Struts框架吗?谢谢你的帮助。这是我的部分代码,我使用的是来自 我已经改为使用ZipInputStream,但是,如何在不使用本地磁盘地址(即:C://ZipFile.zip)的情况下引用ZipFile zip。z

我正在尝试创建一个上载servlet,用于处理来自表单的enctype=“multipart/form data”。我试图上传的文件是zip文件。但是,我可以在localhost上上载和读取文件,但是当我上载到服务器时,当我想要上载文件时,会出现“未找到文件”错误。这是因为我使用的Struts框架吗?谢谢你的帮助。这是我的部分代码,我使用的是来自

我已经改为使用ZipInputStream,但是,如何在不使用本地磁盘地址(即:C://ZipFile.zip)的情况下引用ZipFile zip。zip为空,因为它未实例化。我需要解压并读取内存中的zipentry,而无需写入服务器

对于上载servlet: > 私人拉链; 私人CSVReader阅读器; 布尔值isMultipart=ServletFileUpload.isMultipartContent(请求); if(isMultipart){ DiskFileItemFactory=新的DiskFileItemFactory()

ServletFileUpload upload=新的ServletFileUpload(工厂);
列表项=upload.parseRequest(请求);
迭代器iter=items.Iterator();
while(iter.hasNext()){
//迭代上传的zip文件并读取内容
FileItem=(FileItem)iter.next();
ZipInputStream输入=新的ZipInputStream(item.getInputStream());
ZipEntry条目=null;
而((entry=input.getNextEntry())!=null){
ZipEntry条目=(ZipEntry)e.nextElement();
if(entry.getName().toString().equals(“file.csv”)){
//解压(条目)
}
}
}
公共静态无效解压缩(ZipEntry条目){
试一试{
InputStream InputStream=**zip**.getInputStream(条目);
InputStreamReader InputStreamReader=新的InputStreamReader(inputStream);
读卡器=新的CSVReader(inputStreamReader);
}
捕获(例外e){
e、 printStackTrace();
}
}
这里,

zip = new ZipFile(new File(fileName));
您假设服务器计算机上的本地磁盘文件系统已包含与客户端名称完全相同的文件。这是错误的假设。它在本地主机上工作显然是因为webbrowser和webserver“巧合”在具有相同磁盘文件系统的同一台计算机上运行

此外,您似乎正在使用Internet Explorer作为浏览器,它在文件名中错误地包含完整路径,如
C:/full/path/to/file.ext
。您不应该依赖于此浏览器特定的错误。其他浏览器如Firefox只正确发送文件名,如
file.ext
,这反过来会导致失败ith
新文件(文件名)
(这应该可以帮助您更快地发现错误)

要解决此“问题”,您需要通过
项以
InputStream
的形式获取文件内容。getInputStream()

或者通过
项将其写入磁盘。写入(文件)
并在
ZipFile
中引用它:

File file = File.createTempFile("temp", ".zip");
item.write(file);
ZipFile zipFile = new ZipFile(file);
// ...

注意:不要忘了事先检查文件扩展名,否则可能会阻塞。

谢谢你的回复,但我一直在引用ZipFile zip。如果不引用实际文件,我就无法让它工作,因为实际的服务器将无法工作。我已经编辑了上面的代码。将其写入磁盘,然后引用
文件
ZipFile
。你是说ZipFile zip=(ZipFile)项。写入(文件)?此文件将引用到何处?哦,是的,创建临时文件,我错过了。谢谢!
ZipInputStream input = new ZipInputStream(item.getInputStream());
// ...
File file = File.createTempFile("temp", ".zip");
item.write(file);
ZipFile zipFile = new ZipFile(file);
// ...