无法使用 ServletContext 从路径获取 ResourceAsStream
Can't get ResourceAsStream from path using ServletContext
我有一个处理附加文件下载的 Servlet。我从请求中获取附加文件的路径,并尝试使用 ServletContext 从中获取资源作为流,但我总是将 InputStream 获取为 null,以下是我的 doGet 方法:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String path = request.getParameter("path");
// Fetch File name from path and Then depending on the File extension choose
// which ContentType using Switch structure
Path p = Paths.get(path);
String fileName = p.getFileName().toString();
Optional<String> fileExtension = Optional.ofNullable(fileName).filter(f -> f.contains("."))
.map(f -> f.substring(fileName.lastIndexOf(".") + 1));
System.out.println("This is File Name: " + fileName);
System.out.println("This is File Extension: " + fileExtension.orElseGet(null));
/// Set ContentType of the HTTP header depending on the File
/// Extensions
switch (fileExtension.orElseGet(null).toLowerCase()) {
case "txt":
response.setContentType("text/plain");
break;
case "pdf":
response.setContentType("application/pdf");
break;
case "doc":
response.setContentType("application/msword");
break;
case "docx":
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
break;
case "xlsx":
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
break;
case "zip":
response.setContentType("application/zip");
break;
case "jpeg":
response.setContentType("image/jpeg");
break;
case "jpg":
response.setContentType("image/jpeg");
break;
case "png":
response.setContentType("image/png");
break;
case "rar":
response.setContentType("application/x-rar-compressed");
break;
default:
break;
}
response.setHeader("Content-disposition", "attachment; filename=" + fileName);
//URL url = getClass().getResource(path);
//InputStream strm=url.openStream();
try(InputStream in = request.getServletContext().getResourceAsStream(path);
OutputStream out = response.getOutputStream()) {
byte[] buffer = new byte[ARBITARY_SIZE];
int numBytesRead;
while ((numBytesRead = in.read(buffer)) > 0) {
out.write(buffer, 0, numBytesRead);
}
}
}
下面是附件文件夹路径:
src/main/webapp
为Servlet根文件夹,即webapp
文件夹中的文件和文件夹被复制到根目录下的.war
文件中。
servletContext.getResourceAsStream(path)
的 path
参数必须与之相关,并且必须以 /
开头。
所以要读取该文件,您需要 path = "/resources/Attachments/new 1.txt"
我有一个处理附加文件下载的 Servlet。我从请求中获取附加文件的路径,并尝试使用 ServletContext 从中获取资源作为流,但我总是将 InputStream 获取为 null,以下是我的 doGet 方法:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String path = request.getParameter("path");
// Fetch File name from path and Then depending on the File extension choose
// which ContentType using Switch structure
Path p = Paths.get(path);
String fileName = p.getFileName().toString();
Optional<String> fileExtension = Optional.ofNullable(fileName).filter(f -> f.contains("."))
.map(f -> f.substring(fileName.lastIndexOf(".") + 1));
System.out.println("This is File Name: " + fileName);
System.out.println("This is File Extension: " + fileExtension.orElseGet(null));
/// Set ContentType of the HTTP header depending on the File
/// Extensions
switch (fileExtension.orElseGet(null).toLowerCase()) {
case "txt":
response.setContentType("text/plain");
break;
case "pdf":
response.setContentType("application/pdf");
break;
case "doc":
response.setContentType("application/msword");
break;
case "docx":
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
break;
case "xlsx":
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
break;
case "zip":
response.setContentType("application/zip");
break;
case "jpeg":
response.setContentType("image/jpeg");
break;
case "jpg":
response.setContentType("image/jpeg");
break;
case "png":
response.setContentType("image/png");
break;
case "rar":
response.setContentType("application/x-rar-compressed");
break;
default:
break;
}
response.setHeader("Content-disposition", "attachment; filename=" + fileName);
//URL url = getClass().getResource(path);
//InputStream strm=url.openStream();
try(InputStream in = request.getServletContext().getResourceAsStream(path);
OutputStream out = response.getOutputStream()) {
byte[] buffer = new byte[ARBITARY_SIZE];
int numBytesRead;
while ((numBytesRead = in.read(buffer)) > 0) {
out.write(buffer, 0, numBytesRead);
}
}
}
下面是附件文件夹路径:
src/main/webapp
为Servlet根文件夹,即webapp
文件夹中的文件和文件夹被复制到根目录下的.war
文件中。
servletContext.getResourceAsStream(path)
的 path
参数必须与之相关,并且必须以 /
开头。
所以要读取该文件,您需要 path = "/resources/Attachments/new 1.txt"