2016-12-06 2 views
0

TL; DR Wie kann ich eine Datei von meinem Server mit Java-Portlet ResourceRequest herunterladen?Laden Sie eine Datei in den Browser mit liveray ServerResource

Ich bin im Wesentlichen ein Browser für unser CMS mit einem Liferay 6.1.0 Portlet mit der GenericPortlet-Klasse. Wenn in der Datei "view.jsp" ein Benutzer eine CMS-Ressource geöffnet hat und die Ressource (eine HTML-Seite) Links zu PDFs oder Bildern enthält, würden diese Links den folgenden Code auslösen, um die Ressource zum Herunterladen anzufordern (um normales Verhalten nachzuahmen). :

view.jsp

<portlet:resourceURL var="ajaxResourceUrl"/> 

$("#file-viewer").on("click", "a", function(e){ 
/* Prevent normal link navigation behavior*/ 
e.preventDefault(); 

/* Get the name of the file we want to download*/ 
var linkPath = $(this).attr("href"); 

/* Send the path to the server with resource request*/ 
$.ajax({ 
    method: 'POST', 
    url: '<%= ajaxResourceUrl %>', 
    data: {"action": "displayAttachment", "attachment": linkPath }, 
    dataType: "text", 
    success: function(data) { 
     console.log("success:" + data.substring(0, 10)); 
     if(data !== ""){ 
      if(linkPath.substring(linkPath.length - 4, linkPath.length) === ".pdf"){ 
       /* Resource is a PDF */ 


      } else { 
       /* Resource is HTML */ 

       var html = data; 
       var uri = "data:text/html," + encodeURIComponent(html); 
       var newWindow = window.open(uri); 

      } 
     } else { 
      $("#file-viewer").html("Error retrieving attachment \n" +  $("#file-viewer").html()); 

     } 
    }, 
    error: function(err) { 
     console.log("error" + err); 
    } 

}); 

}); 

die durch dieses Verfahren auf dem Server behandelt wird:

CMSBrowser.java

public void serveResource(ResourceRequest request, ResourceResponse response) throws PortletException, IOException { 

    String action = request.getParameter("action"); 

    // handler for multiple ajax actions 
    if (new String("displayItem").equals(action)) { 

     //other irrelevant code 

    } else if (new String("displayAttachment").equals(action)) { 

     String filePath = request.getParameter("attachment"); 
     PortletPreferences portletPreferences = request.getPreferences(); 
     String rootPath = portletPreferences.getValue("rootPath", ""); 
     filePath = rootPath + filePath; 

     try { 
       File f = new File(filePath); 
       System.out.println("Trying to serve: " + filePath); 

       String mimeType = request.getPortletSession().getPortletContext().getMimeType(f.getName()); 

       response.setContentType(mimeType); 
       response.addProperty(
        HttpHeaders.CACHE_CONTROL, "max-age=3600, must-revalidate"); 

       OutputStream out = response.getPortletOutputStream(); 

       InputStream in = new FileInputStream(f); // some InputStream 


        byte[] buffer = new byte[4096]; 
        int len; 

        while ((len = in.read(buffer)) != -1) { 
         out.write(buffer, 0, len); 
        } 

        out.flush(); 
        in.close(); 
        out.close(); 

      } catch (IOException e) { 
       _log.error("serveResource: Unable to write IO stream, IOException: ", e); 
      } 

    } 
} 

Ich erhalte keine Fehler in Eclipse, in meinem Browser oder in meinen Serverprotokollen. Es geschieht nichts, außer dass die Ajax-Erfolgsmethode den "Error retrieving attachment" zurückgibt, falls nichts vom Server zurückgegeben wird.

Ich fand den Java-Code here wie der 4. Post.

Ich versuche, dies zu verwenden, um PDFs und Bilder, die sich auf dem Server befinden, aber nicht im Portlet/Portal oder anderweitig im Internet verfügbar sind, in einem neuen Tab herunterzuladen/zu öffnen. Diese Methode funktioniert mit HTML-Seiten.

Meine Frage ist, wie kann ich eine Datei von meinem Server mit Java-Portlet ResourceRequest herunterladen?

(wenn es nicht übereinstimmen Schließen Klammern oder geschweiften Klammern diese bitte ignorieren, hatte ich zu diesem Post hier eine erhebliche Menge an Code auszuschneiden, bis alles Linien und schließt in meiner IDE korrekt).

+0

Sie sollten Ihren Java-Code debuggen und in Ihrem Browser überprüfen, ob die Ajax-Anfrage in Ordnung ist –

Antwort

0

Nach mehreren Versuchen mit ähnlichen Lösungen, die ich versuchte, die AJAX-Funktion in view.jsp entfernt und ersetzt es mit diesem:

window.open('<%= ajaxResourceUrl %>&action=displayAttachment&attachment=' + linkPath); 

Dieses (irgendwie) gearbeitet, und es erlaubt mir nun HTML, PDF-Dateien zu öffnen und Bilder in einem neuen Tab.