JSP+JSPSmartUpload 文件上传后没有上传到指定目录下

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub
SmartUpload su=new SmartUpload();
su.initialize(servletconfig, request, response);
su.setMaxFileSize(100000);
su.setTotalMaxFileSize(200000);
su.setAllowedFilesList("doc,txt");
try {
su.setDeniedFilesList("exe,bat,jsp,html,htm");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
su.upload();
} catch (SmartUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
int count=su.save("/upload");
if(count>0){System.out.println("succeed!");//成功后再跳转这里未写}
} catch (SmartUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
由upload.jsp中的一个表单上传选择文件后,action指向该servlet,然后,我是想把上传的文件保存到根目录ch1下的upload文件下的,可不知道为什么,有时候能成功,有时候不能成功(成功之后我把upload删除了,Eclipse退出来,再新建upload文件夹后再试又不成功了),然后成功的时候我去查了下上传文件在哪?结果查到是D:\Eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\ch1\upload
(在不成功的时候,在这个目录下是没有upload文件夹的,新建它就能成功了)
我度娘了下,知道这是Eclipse工作的缓存工作区,有时好像我在D:\Eclipse\workspace\ch1\WebContent下新建upload文件夹再运行upload.jsp好像可以自动在D:\Eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\ch1\upload自动创建一个upload文件夹,然后上传就成功了,但有时不行,不知道为什么?
还有这是为什么啊?上传的路径这样写不是直接放在D:\Eclipse\workspace\ch1\WebContent\upload下的吗?怎么跑到这个莫名其妙的地方了?

第1个回答  2014-12-03
1、上传有时候能成功,有时候不能成功:
如果使用eclipse运行应用,则应用默认部署在workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\这个目录里,ch1应该是你的工程的名字,SmartUpload的save方法是相对于工程根目录而言。
至于上传失败,应该是由于目录不存在的原因。
当你在工程中创建upload后,刷新工程可以直接在workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\ch1下生成相同的目录。

2、上传的路径这样写不是直接放在WebContent\upload下的吗?

如果想把文件上传到WebContent\upload下,可以把应用直接部署到tomcat的webapps目录下。

可以在上传之前判断下目录是否存在,试试这种写法:

String savePath = getClass().getClassLoader().getResource("/").toString().substring(6) + "/upload";
File f = new File(savePath);
if (!f.exists()) {
f.mkdirs()

}
int count=su.save(savePath);追问

1.这里的根目录不是应该是web工程的根目录(\ch1)吗?

2.我在Eclipse下WebContent下创建文件夹upload后刷新,那个目录不会生成,之前成功的那几次我都不知道是什么情况下才成功的,

3.应用是在Eclipse下创建的,它创建后都是在Eclipse的工作工程下的啊
4.最后还是保存在D:....\.metadata\.....\ch1\WEB-INF\classes\upload

追答

1、按理说根目录应该是ch1,但实际上eclipse是把WebContent中的内容全部拷贝到工作空间,所以WebContent是真正意义上的根目录
2、如果刷新的时候不自动生成,可以试试直接运行或者重新部署
3、你说的没错
4、抱歉,写的不对,这样:
String savePath = request.getRealPath("/") + "/upload";

追问

还是放在.metadata\...这个文件下,好像是因为servlet编译成class文件后,在Eclipse下class文件就是放在.metadata....Eclipse实际工作目录下,我想的是把上传的文件放在我们可以在Eclipse上直接操作的这个目录下(而不是.metadata..Eclipse实际工作目录下),除了绝对路径好像没什么办法

追答

注意区分下部署目录和工程目录。web应用程序是在部署目录执行的。

.metadata是部署目录,WebContent是工程目录。

如果使用eclipse运行程序,那么工程就会部署到.metadata下面,实际文件就保存到该目录下。

把项目拷贝到tomcat下的webapps下,也就是直接部署到服务器上,上传文件保存到该目录里。

追问

也就是说在Eclipse中创建工程的时候要将工程目录放到tomcat的webapps下?那知道了。那还是那个问题:在Eclipse下,我在上面创建文件夹upload刷新后在部署目录下不会生成相应的文件(我试了下,若是再在upload下创建一个JSP文件部署目录就会生成upload文件夹),可之前好像不知道怎么,部署目录下会自动生成upload文件夹,你说的直接运行和重新部署是什么意思?怎么做?

追答

直接运行:


在webapps下新建目录ch1,把工程内容拷贝到tomcat下的;(拷贝的是WebContent下的文件,把编译好的最新的class文件放到WEB-INF下的classes中)


这里的webapps/ch1就是部署的目录,与工程的实际目录不一样。(工程的目录可能在e:/ch1)


启动tomcat,访问servlet,上传的文件就保存到webapps/ch1/upload文件夹里。不会放到.metadata里面了。



不知道你的目的是不是这样?



重新部署:


追问

重新部署:Server标签下我并没有看到Status、Mode、Location等选项啊,如图:

追答

看来你的是eclipse,没有部署的功能。

要想使新建的upload目录体现在工作空间,除了刷新之外,可以试着手动删除已部署的工程,或直接Run as on server等,多试试。

相对而言,My Eclipse就方便很多了。

本回答被提问者采纳
相似回答