【问题标题】:OpenShift Java - Use image out of Data dirOpenShift Java - 使用数据目录中的图像
【发布时间】:2016-03-27 12:06:13
【问题描述】:

我正在尝试创建一个上传图片按钮,然后在不同的 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>

这两个选项都不起作用。我还读到我需要创建一个符号链接。但是当我在我的app-root/dataapp-root/data/imagesapp-root 中时,命令ln -s 返回missing file operand

logo21.jpg 确实出现在我的 Git bash 中

【问题讨论】:

  • 使用 System.getenv 创建到带有 ssh 密钥的图像的链接。
  • 您是否尝试按照here 的描述使用deploy 操作挂钩创建符号链接?

标签: java jsp openshift


【解决方案1】:

@developercorey 是对的(给你+1?),我只是觉得有必要解释一下原因:

  • 您上传的图片最终保存在您的服务器
    上的文件夹中 (String filepath = System.getenv("OPENSHIFT_DATA_DIR") + "images/"是服务器中的文件夹路径)。
  • 您呈现的 HTML "&lt;img src='"+filepath+"logo21.jpg'/&gt; 将发送到 客户端(用户的浏览器),并带有服务器的 filepath url。
  • 显然,当用户的浏览器尝试使用本地计算机上不存在的服务器路径来定位图像时,它将无法正常工作。

正如@developercorey 建议的那样,最好的解决方案是添加一个新的 servlet 或过滤器来提供来自OPENSHIFT_DATA_DIR 文件夹的照片:

  • 您将拥有一个映射到为您的照片提供服务的 servlet 的新 URL,例如 http://your-server/uploaded/
  • 你可以在你的jsp中使用&lt;img src="http://your-server/uploaded/logo21.jpg" /&gt;

这是来自How-To: Upload and Serve files using Java Servlets on OpenShift的sn-p

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;
    }
}

【讨论】:

    【解决方案2】:

    为您存储在 OPENSHIFT_DATA_DIR 中的用户上传图像提供服务的最佳方式是使用此处所述的 servlet:https://forums.openshift.com/how-to-upload-and-serve-files-using-java-servlets-on-openshift?noredirect

    这个 servlet 基本上获取被请求图像的路径/名称,从文件系统中读取它,然后将其提供给请求者。

    【讨论】:

      【解决方案3】:

      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&lt;img src="/images/logo21.jpg"/&gt; 访问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
      

      【讨论】:

      • Hmmmm...这可能不适用于 JSP...您实际上将不得不提供图像 =\
      • 我在 .openshift/action_hooks/deploy 中什至没有任何文件。我怎样才能生成这些或deploy 需要有什么扩展名? “提供图片”是什么意思?
      • 查看@developercorey 的回复
      • @Ivaro18:即使这是一个相当古老的问题,请参阅Action Hooks 了解有关此主题的更多信息。您只需要创建一个新文件“deploy”(不需要扩展名)并推送它。在每次部署时(例如由 git push 触发),都会执行此操作挂钩。
      【解决方案4】:

      您可以将文件上传到 DATA DIRECTORY,然后将文件从 DATA DIRECTORY 复制到 HOME DIRECTORY 中的任何文件夹。

      之后,您应该能够像往常一样在页面中引用该图像,但似乎 Openshift 仅显示来自先前部署或 git push 的项目,因此最好将文件保存在数据库中,然后直接从中读取数据库。

      【讨论】:

        猜你喜欢
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        相关资源
        最近更新 更多