2016-03-27 7 views
5

Ich versuche, eine Upload-Image-Schaltfläche erstellen und anschließend das Bild auf einer anderen JSP-Seite anzeigen.OpenShift Java - Verwenden Sie Bild aus Datenverzeichnis

Ich möchte dies in den app-root/data/images Ordner durch das Hochladen tun. Dies funktioniert mit dem folgenden Dateipfad: filePath = System.getenv("OPENSHIFT_DATA_DIR") + "images/";

Aber wie kann ich zeigen, das Bild auf meinem jsp? Ich habe versucht mit:

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

Beide Optionen funktionieren nicht. Ich lese auch, dass ich eine symbolische Verbindung erstellen muss. Aber wenn ich in meinem app-root/data oder app-root/data/images oder in app-root den Befehl ln -s kehrt missing file operand

Die logo21.jpg tut zeigen in meinem Git Bash

+0

Mit 'System.getenv' wird die Verknüpfung zum Bild mit dem ssh-Schlüssel erstellt. – Ivaro18

+0

Haben Sie versucht, den symbolischen Link mit dem Aktionshaken 'deploy' wie hier [hier] (http://stackoverflow.com/a/29924096/5400813) beschrieben zu erstellen? –

Antwort

3

@developercorey rechts (gab man +1), ich habe das Bedürfnis, nur um zu erklären, warum:

  • Ihre Bilder hochgeladen enden in einem Ordner auf Ihrem Server
    (String filepath = System.getenv("OPENSHIFT_DATA_DIR") + "images/" ist der Ordner Pfad im Server).
  • Ihr gerenderter HTML-Code "<img src='"+filepath+"logo21.jpg'/> wird an den Client (der Browser des Benutzers) gesendet, mit der filepath URL des Servers.
  • Offensichtlich, wenn der Browser des Benutzers versucht, das Bild zu finden, mit dem Pfad des Servers, der nicht auf dem lokalen Computer vorhanden ist, wird es nicht funktionieren.

Die beste Lösung, wie @developercorey vorgeschlagen, ist ein neues Servlet oder einen Filter hinzuzufügen, Fotos aus dem OPENSHIFT_DATA_DIR Ordner zu dienen:

  • Sie müssen eine neue URL zum Servlet abgebildet dienen Ihr Foto, etwas wie http://your-server/uploaded/
  • Und Sie können <img src="http://your-server/uploaded/logo21.jpg" /> in Ihrem JSP verwenden.

Hier ist der Ausschnitt aus 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; 
    } 
} 
1

Das OPENSHIFT_DATA_DIR Verzeichnis ist nicht Webzugriff. Sie können Bilder, die im Verzeichnis OPENSHIFT_DATA_DIR (aka app-root/data) gespeichert sind, über das Web zugänglich machen, indem Sie einen Symlink zu ihnen aus dem öffentlich zugänglichen OPENSHIFT_REPO_DIR erstellen.

Für den einmaligen Gebrauch, als Proof of Concept:

rhc ssh -a <your_app_name> -n <your_namespace> 
ln -sf ${OPENSHIFT_DATA_DIR}images ${OPENSHIFT_REPO_DIR}images 

Sie sollten nun in der Lage sein logo21.jpg auf https://<your_app_name>-<your_namespace>.rhcloud.com/images/logo21.jpg zuzugreifen oder <img src="/images/logo21.jpg"/>.

Der Inhalt der OPENSHIFT_REPO_DIR wird überschrieben, wenn Sie Änderungen übertragen. Daher sollten Sie den Symlink mit einem Deploy-Hook erstellen, um ihn bei jeder Bereitstellung neu zu erstellen. In .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 
+0

Hmmmm ... das wird wahrscheinlich nicht für JSP funktionieren ... du musst die Bilder wirklich liefern == – luciddreamz

+0

Ich habe noch keine Datei in '.openshift/action_hooks/deploy'. Wie kann ich diese generieren oder welche Erweiterung muss 'deploy' haben? Und was meinst du mit "diene den Bildern"? – Ivaro18

+0

Siehe die Antwort von @developercorey – luciddreamz

0

Sie können die Datei in das Datenverzeichnis laden, kopieren Sie die Datei aus dem Datenverzeichnis in einem beliebigen Ordner im Home-Verzeichnis.

Danach sollten Sie in der Lage sein, das Bild wie gewohnt auf Ihrer Seite zu referenzieren, aber es scheint, dass Openshift nur Elemente aus einer früheren Deployment- oder Git-Push-Operation anzeigt. Daher ist es am besten, die Datei in einer Datenbank zu speichern und dann direkt zu lesen diese Datenbank.

Verwandte Themen