我目前正在开发一个Web应用程序。在这个应用程序的某些部分,我想将文件上传到某个目录。最初,当我编写我的测试用例时,这非常有效:
final static String IMAGE_RESOURCE_PATH = "res/images";
...
File directory = new File(IMAGE_RESOURCE_PATH + "/" + productId);
if(!directory.exists()) {
directory.mkdirs();
}
这将创建将上载文件的目录。生成的路径为:
[项目根文件夹] / res / images / [productId]
自从将应用程序部署到服务器(Tomcat 7)后,该目录就会在我正在使用的IDE的根目录中创建,这对我来说有点混乱。
例如:C:\ Eclipse86 \ res \ images
任何想法如何在不使用某些黑客技术或硬编码路径的情况下使用普通Java恢复到项目路径?
答案 0 :(得分:5)
如果未指定绝对路径,则将在应用程序的工作目录内(或者,如果正确地,相对于)创建目录。
如果要在Web应用程序中获取目录,则应使用getServletContext().getRealPath(String path)
。例如,getServletContext().getRealPath("/")
是应用程序根目录的路径。
要创建路径为[project root folder]/res/images/[productId]
的目录,请执行以下操作:
// XXX Notice the slash before "res"
final static String IMAGE_RESOURCE_PATH = "/res/images";
...
String directoryPath =
getServletContext().getRealPath(IMAGE_RESOURCE_PATH + "/" + productId)
File directory = new File(directoryPath);
if(!directory.exists()) {
directory.mkdirs();
}
答案 1 :(得分:1)
几年前我写了一个DOWNloads文件的servlet。您可以快速重构它以进行上传。你走了:
public class ServletDownload extends HttpServlet {
private static final int BYTES_DOWNLOAD = 1024;
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException {
response.setContentType("text/plain");
response.setHeader("Content-Disposition", "attachment;filename=downloadname.txt");
ServletContext ctx = getServletContext();
InputStream is = ctx.getResourceAsStream("/downloadme.txt");
int read = 0;
byte[] bytes = new byte[BYTES_DOWNLOAD];
OutputStream os = response.getOutputStream();
while((read = is.read(bytes))!= -1) {
os.write(bytes, 0, read);
}
os.flush();
os.close();
}
}
此外,还有一种简单的方法来获取项目的路径,如新的File()。getAbsolutePath()。