我正在尝试创建一个从表单处理enctype =“multipart / form-data”的上传servlet。我要上传的文件是zip。但是,我可以在localhost上传和读取文件,但是当我上传到服务器时,当我想上传文件时,我收到“找不到文件”错误。这是由于我使用的Struts框架吗?谢谢你的帮助。以下是我的代码的一部分,我正在使用http://commons.apache.org/fileupload/using.html
中的FileUpload我已经改为使用ZipInputStream,但是,如何在不使用本地磁盘地址的情况下引用ZipFile zip(即:C://zipfile.zip)。 zip为null,因为它未实例化。我需要在内存中解压缩并读取zipentry,而无需写入服务器。
对于上传servlet: > 私人ZipFile拉链; 私人CSV阅读器; boolean isMultipart = ServletFileUpload.isMultipartContent(request); 如果(isMultipart){ DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List <FileItem> items = upload.parseRequest(request);
Iterator iter = items.iterator();
while (iter.hasNext()) {
//Iterating through the uploaded zip file and reading the content
FileItem item = (FileItem) iter.next();
ZipInputStream input = new ZipInputStream(item.getInputStream());
ZipEntry entry = null;
while (( entry= input.getNextEntry()) != null) {
ZipEntry entry = (ZipEntry) e.nextElement();
if(entry.getName().toString().equals("file.csv")){
//unzip(entry)
}
}
}
public static void unzip(ZipEntry entry){
try{
InputStream inputStream = **zip**.getInputStream(entry);
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
reader = new CSVReader(inputStreamReader);
}
catch(Exception e){
e.printStackTrace();
}
}
&LT;
答案 0 :(得分:0)
下面,
zip = new ZipFile(new File(fileName));
您假设服务器计算机上的本地磁盘文件系统已包含与客户端名称完全相同的文件。这是一个错误的假设。它在localhost上工作显然是因为webbrowser和webserver“巧合”在同一台机器上使用相同的磁盘文件系统运行。
此外,您似乎使用Internet Explorer作为浏览器,错误地包含文件名中的完整路径,如C:/full/path/to/file.ext
。您不应该依赖此浏览器特定的错误。像Firefox这样的其他浏览器只能正确地发送file.ext
这样的文件名,这反过来会导致new File(fileName)
失败(这应该会帮助你更快地发现你的错误)。
要解决此“问题”,您需要InputStream
获取item.getInputStream()
文件内容:
ZipInputStream input = new ZipInputStream(item.getInputStream());
// ...
或者item.write(file)
将其写入磁盘并在ZipFile
中引用它:
File file = File.createTempFile("temp", ".zip");
item.write(file);
ZipFile zipFile = new ZipFile(file);
// ...
注意:不要忘记事先检查文件扩展名,否则可能会阻塞。