OpenShift Java - 使用数据目录中的图像
OpenShift Java - Use image out of Data dir
我正在尝试创建一个上传图像按钮,然后在另一个 jsp 页面上显示该图像。
我想通过上传到 app-root/data/images
文件夹来完成此操作。这适用于以下文件路径:filePath = System.getenv("OPENSHIFT_DATA_DIR") + "images/";
但是如何在 jsp 上显示此图像?我尝试使用:
<BODY>
<h1>SNOOP PAGE</h1>
<a href="profielMijnBedrijf.jsp">Ga weer terug</a>
<% String filepath = System.getenv("OPENSHIFT_DATA_DIR") + "images/";
out.println("<img src='"+filepath+"logo21.jpg'/>");
%>
<img src="app-root/data/images/logo21.jpg"/>
</BODY>
这两个选项都不起作用。我还读到我需要创建一个符号 link。但是当我在 app-root/data
或 app-root/data/images
或 app-root
中时,命令 ln -s
returns missing file operand
logo21.jpg 确实出现在我的 Git bash
中
OPENSHIFT_DATA_DIR
目录不可通过网络访问。您可以通过从可公开访问的 OPENSHIFT_REPO_DIR
.
创建指向它们的符号链接,使存储在 OPENSHIFT_DATA_DIR
(又名 app-root/data
)目录中的图像可通过网络访问
一次性使用,作为概念证明:
rhc ssh -a <your_app_name> -n <your_namespace>
ln -sf ${OPENSHIFT_DATA_DIR}images ${OPENSHIFT_REPO_DIR}images
您现在应该可以在 https://<your_app_name>-<your_namespace>.rhcloud.com/images/logo21.jpg 或 <img src="/images/logo21.jpg"/>
.
访问 logo21.jpg
当您推送更改时,OPENSHIFT_REPO_DIR
的内容会被覆盖,因此您需要使用部署挂钩创建符号链接,以便在每次部署时重新创建它。在 .openshift/action_hooks/deploy
:
#!/bin/bash
# This deploy hook gets executed after dependencies are resolved and the
# build hook has been run but before the application has been started back
# up again.
# create the images directory if it doesn't exist
if [ ! -d ${OPENSHIFT_DATA_DIR}images ]; then
mkdir ${OPENSHIFT_DATA_DIR}images
fi
# create symlink to uploads directory
ln -sf ${OPENSHIFT_DATA_DIR}images ${OPENSHIFT_REPO_DIR}images
为存储在 OPENSHIFT_DATA_DIR 中的用户上传图像提供服务的最佳方式是使用此处所述的 servlet:https://forums.openshift.com/how-to-upload-and-serve-files-using-java-servlets-on-openshift?noredirect
这个 servlet 基本上获取所请求图像的 path/name,从文件系统中读取它,然后将其提供给请求者。
@developercorey 是对的(给你+1),我只是觉得有必要解释一下原因:
- 您上传的图片最终保存在您的 服务器
上的一个文件夹中
(String filepath = System.getenv("OPENSHIFT_DATA_DIR") + "images/"
是服务器中的文件夹路径)。
- 您呈现的 HTML
"<img src='"+filepath+"logo21.jpg'/>
与服务器的 filepath
url 一起发送到 客户端 (用户的浏览器) ].
- 显然,当用户的浏览器尝试定位图像时,使用本地机器上不存在的服务器路径是行不通的。
正如@developercorey 所建议的那样,最好的解决方案是添加一个新的 servlet 或过滤器来提供 OPENSHIFT_DATA_DIR
文件夹中的照片:
- 您将有一个新的 url 映射到为您的照片提供服务的 servlet,类似于
http://your-server/uploaded/
- 并且您可以在 jsp 中使用
<img src="http://your-server/uploaded/logo21.jpg" />
。
这是来自 How-To: Upload and Serve files using Java Servlets on OpenShift
的片段
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.activation.MimetypesFileTypeMap;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@WebServlet(name = "uploads",urlPatterns = {"/uploads/*"})
@MultipartConfig
public class Uploads extends HttpServlet {
private static final long serialVersionUID = 2857847752169838915L;
int BUFFER_LENGTH = 4096;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
for (Part part : request.getParts()) {
InputStream is = request.getPart(part.getName()).getInputStream();
String fileName = getFileName(part);
FileOutputStream os = new FileOutputStream(System.getenv("OPENSHIFT_DATA_DIR") + fileName);
byte[] bytes = new byte[BUFFER_LENGTH];
int read = 0;
while ((read = is.read(bytes, 0, BUFFER_LENGTH)) != -1) {
os.write(bytes, 0, read);
}
os.flush();
is.close();
os.close();
out.println(fileName + " was uploaded to " + System.getenv("OPENSHIFT_DATA_DIR"));
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filePath = request.getRequestURI();
File file = new File(System.getenv("OPENSHIFT_DATA_DIR") + filePath.replace("/uploads/",""));
InputStream input = new FileInputStream(file);
response.setContentLength((int) file.length());
response.setContentType(new MimetypesFileTypeMap().getContentType(file));
OutputStream output = response.getOutputStream();
byte[] bytes = new byte[BUFFER_LENGTH];
int read = 0;
while ((read = input.read(bytes, 0, BUFFER_LENGTH)) != -1) {
output.write(bytes, 0, read);
output.flush();
}
input.close();
output.close();
}
private String getFileName(Part part) {
for (String cd : part.getHeader("content-disposition").split(";")) {
if (cd.trim().startsWith("filename")) {
return cd.substring(cd.indexOf('=') + 1).trim()
.replace("\"", "");
}
}
return null;
}
}
您可以将文件上传到数据目录,然后将文件从数据目录复制到主目录中的任意文件夹。
此后您应该能够像往常一样在您的页面中引用图像,但 Openshift 似乎只显示以前部署或 git 推送的项目,因此最好将文件保存在数据库中然后直接从该数据库中读取它。
我正在尝试创建一个上传图像按钮,然后在另一个 jsp 页面上显示该图像。
我想通过上传到 app-root/data/images
文件夹来完成此操作。这适用于以下文件路径:filePath = System.getenv("OPENSHIFT_DATA_DIR") + "images/";
但是如何在 jsp 上显示此图像?我尝试使用:
<BODY>
<h1>SNOOP PAGE</h1>
<a href="profielMijnBedrijf.jsp">Ga weer terug</a>
<% String filepath = System.getenv("OPENSHIFT_DATA_DIR") + "images/";
out.println("<img src='"+filepath+"logo21.jpg'/>");
%>
<img src="app-root/data/images/logo21.jpg"/>
</BODY>
这两个选项都不起作用。我还读到我需要创建一个符号 link。但是当我在 app-root/data
或 app-root/data/images
或 app-root
中时,命令 ln -s
returns missing file operand
logo21.jpg 确实出现在我的 Git bash
中OPENSHIFT_DATA_DIR
目录不可通过网络访问。您可以通过从可公开访问的 OPENSHIFT_REPO_DIR
.
OPENSHIFT_DATA_DIR
(又名 app-root/data
)目录中的图像可通过网络访问
一次性使用,作为概念证明:
rhc ssh -a <your_app_name> -n <your_namespace>
ln -sf ${OPENSHIFT_DATA_DIR}images ${OPENSHIFT_REPO_DIR}images
您现在应该可以在 https://<your_app_name>-<your_namespace>.rhcloud.com/images/logo21.jpg 或 <img src="/images/logo21.jpg"/>
.
logo21.jpg
当您推送更改时,OPENSHIFT_REPO_DIR
的内容会被覆盖,因此您需要使用部署挂钩创建符号链接,以便在每次部署时重新创建它。在 .openshift/action_hooks/deploy
:
#!/bin/bash
# This deploy hook gets executed after dependencies are resolved and the
# build hook has been run but before the application has been started back
# up again.
# create the images directory if it doesn't exist
if [ ! -d ${OPENSHIFT_DATA_DIR}images ]; then
mkdir ${OPENSHIFT_DATA_DIR}images
fi
# create symlink to uploads directory
ln -sf ${OPENSHIFT_DATA_DIR}images ${OPENSHIFT_REPO_DIR}images
为存储在 OPENSHIFT_DATA_DIR 中的用户上传图像提供服务的最佳方式是使用此处所述的 servlet:https://forums.openshift.com/how-to-upload-and-serve-files-using-java-servlets-on-openshift?noredirect
这个 servlet 基本上获取所请求图像的 path/name,从文件系统中读取它,然后将其提供给请求者。
@developercorey 是对的(给你+1),我只是觉得有必要解释一下原因:
- 您上传的图片最终保存在您的 服务器
上的一个文件夹中 (String filepath = System.getenv("OPENSHIFT_DATA_DIR") + "images/"
是服务器中的文件夹路径)。 - 您呈现的 HTML
"<img src='"+filepath+"logo21.jpg'/>
与服务器的filepath
url 一起发送到 客户端 (用户的浏览器) ]. - 显然,当用户的浏览器尝试定位图像时,使用本地机器上不存在的服务器路径是行不通的。
正如@developercorey 所建议的那样,最好的解决方案是添加一个新的 servlet 或过滤器来提供 OPENSHIFT_DATA_DIR
文件夹中的照片:
- 您将有一个新的 url 映射到为您的照片提供服务的 servlet,类似于
http://your-server/uploaded/
- 并且您可以在 jsp 中使用
<img src="http://your-server/uploaded/logo21.jpg" />
。
这是来自 How-To: Upload and Serve files using Java Servlets on OpenShift
的片段import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.activation.MimetypesFileTypeMap;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@WebServlet(name = "uploads",urlPatterns = {"/uploads/*"})
@MultipartConfig
public class Uploads extends HttpServlet {
private static final long serialVersionUID = 2857847752169838915L;
int BUFFER_LENGTH = 4096;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
for (Part part : request.getParts()) {
InputStream is = request.getPart(part.getName()).getInputStream();
String fileName = getFileName(part);
FileOutputStream os = new FileOutputStream(System.getenv("OPENSHIFT_DATA_DIR") + fileName);
byte[] bytes = new byte[BUFFER_LENGTH];
int read = 0;
while ((read = is.read(bytes, 0, BUFFER_LENGTH)) != -1) {
os.write(bytes, 0, read);
}
os.flush();
is.close();
os.close();
out.println(fileName + " was uploaded to " + System.getenv("OPENSHIFT_DATA_DIR"));
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filePath = request.getRequestURI();
File file = new File(System.getenv("OPENSHIFT_DATA_DIR") + filePath.replace("/uploads/",""));
InputStream input = new FileInputStream(file);
response.setContentLength((int) file.length());
response.setContentType(new MimetypesFileTypeMap().getContentType(file));
OutputStream output = response.getOutputStream();
byte[] bytes = new byte[BUFFER_LENGTH];
int read = 0;
while ((read = input.read(bytes, 0, BUFFER_LENGTH)) != -1) {
output.write(bytes, 0, read);
output.flush();
}
input.close();
output.close();
}
private String getFileName(Part part) {
for (String cd : part.getHeader("content-disposition").split(";")) {
if (cd.trim().startsWith("filename")) {
return cd.substring(cd.indexOf('=') + 1).trim()
.replace("\"", "");
}
}
return null;
}
}
您可以将文件上传到数据目录,然后将文件从数据目录复制到主目录中的任意文件夹。
此后您应该能够像往常一样在您的页面中引用图像,但 Openshift 似乎只显示以前部署或 git 推送的项目,因此最好将文件保存在数据库中然后直接从该数据库中读取它。