我想在我的servlet文件中实现一个上载组件,但是它不起作用。
该代码片段如下所示:
SmartUpload smartUpload=new SmartUpload();
StringBuffer stringBuffer=new StringBuffer();
smartUpload.initialize(config,request, response);
try {
smartUpload.upload();
File file=smartUpload.getFiles().getFile(0);
stringBuffer.append(file.getFileName());
file.saveAs("/upload_resources/"+stringBuffer);
} catch (SmartUploadException e) {
e.printStackTrace();
}
upload_resource目录位于WebRoot目录下,代码运行无任何错误,但文件未上传。顺便说一句,即使我改变了路线
file.saveAs("/upload_resources/"+stringBuffer);
至
file.saveAs(request.getRealPath("/upload_resources/")+"/"+stringBuffer);
即使用绝对路径,则不会上传文件。
任何帮助将不胜感激。谢谢。
最佳答案
我从未真正使用过SmartUpload,但是我可以告诉您不要将上传的文件保存在webapp的deploy文件夹中。每当重新部署Web应用程序时,它们都可能丢失,原因很简单,即原始的WAR文件中不包含上载的文件。因此,您不应该在webapp的deploy文件夹中准备上载文件夹,而应在deploy文件夹外的固定路径上准备。
如果SmartUpload设计合理,我希望
file.saveAs("/upload_resources/"+stringBuffer);
会将其保存到与Web服务器启动所在磁盘相同的根目录下的
/uploaded_resources
文件夹中。因此,例如在Windows中将为C:\uploaded_resources
。准备并使用该文件夹。此外,当您使用MSIE浏览器时,还有另一个潜在的问题。该浏览器即错误地在文件名中包含完整的客户端路径。我不确定SmartUpload是否能正确处理此问题,但是您可能想调试
file.getFileName()
的实际值,并确保它实际上只是filename.ext
形式的文件名。否则,您需要使用String#substring()
对最后一个/
和\
之后的部分进行子字符串化。