2016-12-06 7 views
0

TL; DR Как загрузить файл с моего сервера с помощью java-портлета ResourceRequest?Загрузите файл в браузер с помощью liferay ServeResource

Я создаю, по сути, браузер для нашей CMS с портлетом Liferay 6.1.0 с использованием класса GenericPortlet. В view.jsp, как только пользователь открыл ресурс CMS, и если ресурс (HTML-страница) имеет ссылки на PDF-файлы или изображения, эти ссылки вызовут следующий код, чтобы запросить загружаемый ресурс (чтобы имитировать нормальное поведение) :

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

}); 

}); 

который обрабатывается с помощью этого метода на сервере:

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

    } 
} 

Я не получаю никаких ошибок в Eclipse, в своем браузере или в журналах сервера. Ничего не происходит, за исключением того, что метод успеха ajax возвращает «Ошибка получения вложения» в случае, если ничего не возвращается с сервера.

Я нашел код java here согласно 4-му сообщению.

В частности, я пытаюсь использовать это для загрузки/открытия в новой вкладке PDF-файлов и изображений, которые находятся на сервере, но не в портлете/портале или иным образом доступны в Интернете. Этот метод работает с HTML-страницами.

Мой вопрос: как загрузить файл с моего сервера с помощью java-портлета ResourceRequest?

(Если есть несогласованные закрывающиеся круглые скобки или фигурные скобки, пожалуйста, проигнорируйте это, мне пришлось вырезать значительное количество кода, чтобы опубликовать это здесь, все строит вверх и правильно закрывается в моей IDE).

+0

Вы должны отлаживать свой Java-код и проверять свой браузер, если запрос ajax в порядке –

ответ

0

После нескольких попыток с аналогичными решениями я попытался удалить функцию AJAX в View.jsp и заменить его следующим образом:

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

Это (как-то) работал и теперь позволяет мне открыть HTML, PDF-файлы, и изображения на новой вкладке.

 Смежные вопросы

  • Нет связанных вопросов^_^