我有一个问题就是上传文件。它在我的计算机上运行良好,但在部署到服务器时失败。
系统将浏览文件,然后系统会在将其上传到服务器之前将其压缩。当客户端浏览文件时,服务器将生成错误,指出找不到该文件。这是我的代码:
try {
//This is a code to read a zipfile.
String dir = request.getParameter("dirs");
System.out.println(dir);
String tmp = dir.replace( '\\', '/' );
System.out.println(tmp);
String inFilename = tmp;
// String inFilename = dir;
String outFilename = "c:/sms.zip";
//String outFilename = "/webapps/ROOT/sms.zip";
FileInputStream in = new FileInputStream( inFilename);
ZipOutputStream out = new ZipOutputStream(
new FileOutputStream(outFilename));
// Add ZIP entry to output stream.
out.putNextEntry(new ZipEntry(inFilename));
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
//End of zipping file.
//Start uploading.
SimpleFTP ftp = new SimpleFTP();
// Connect to an FTP server on port 21.
ftp.connect("xxxxx", 21, "xxx", "xxxx");
// Set binary mode.
ftp.bin();
// Change to a new working directory on the FTP server.
ftp.cwd("web");
// Upload some files.
ftp.stor(new File("sms.zip"));
ftp.disconnect();
//finish uploading
out.closeEntry();
out.close();
in.close();
response.sendRedirect("../BakMeClient/success.jsp");
}
catch (IOException e) {
System.out.println(e);
}
字符串dir
是文件的位置。
错误消息是:
java.io.FileNotFoundException:D:\ RELIVA \ listmenu.java(系统找不到指定的文件)
感谢您的所有评论。根据我的观察,问题是这个脚本是在不在客户端上的服务器上运行的。
我的意思是让你说你在c:/test.txt浏览文件。当您单击上传按钮时,表单将发送到服务器的路径,服务器将在其自己的目录中找到路径,当然它将找不到它。
我希望你知道发生了什么。现在:如何让它在客户端读取路径?
答案 0 :(得分:3)
这绝对是个问题:
// Upload some files.
ftp.stor(new File("sms.zip"));
存档已在c:/sms.zip
创建,但您尝试从相对文件位置sms.zip
读取它(如果我没记错的话,等于 正确的部分是Joachim的评论,谢谢!! )。${JAVA_HOME}/sms.zip
用
替换这些行// Upload some files.
ftp.stor(new File("c:/sms.zip"));
如果这没有帮助,那么另外在使用FTP发送文件之前尝试关闭ZipOutputStream。由于流仍处于打开状态,因此有可能尚未在文件系统上创建ZIP文件。
答案 1 :(得分:2)
这里有一个重大的误解。您正在发送本地磁盘文件系统路径而不是实际文件内容。想象一下,我是客户,我在c:/passwords.txt
有一个文件,我给你的路径。作为服务器,您将如何获得其内容?
使用new FileInputStream("c:/passwords.txt")
?不,幸运的是 会发生。只有当客户端和服务器在物理上相同的机器上运行时,它才会起作用,如您所知。
使用HTML上传文件(无论它是否在JSP文件中)应该使用<input type="file">
字段完成,如下所示:
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit">
</form>
这样,文件将在请求正文中发送。由于标准版本的Servlet API版本不支持mulipart/form-data
请求,因此您需要自己解析请求。最好的方法是使用Apache Commons FileUpload。请点击链接,阅读用户指南和常见问题解答,了解代码示例和提示及技巧。如果您已经使用Servlet 3.0,那么您可以使用为此提供的Servlet API HttpServletRequest#getParts()
。 You can find here an article with code examples about that
如果您确实要将包含文件的完整文件夹上传到服务器端,并且您不想为此使用多个<input type="file">
字段,那么您需要{{ 3}}或Applet为此,因为普通的HTML不可能实现这一点。在服务器端,您可以以相同的方式解析请求。
答案 2 :(得分:0)
我认为,如果它在您的系统中而不是在服务器中工作,则服务器设置一定存在问题。
或者您可以查看以下内容
需要检查您正在处理的路径。
在上传之前,请在生成ZIP文件后尝试列出该目录中的文件。
检查权限。
答案 3 :(得分:-1)
必须在网络中找到您的outFilename
。喜欢:“http://www.sample.com/sms.zip”或类似的......