Acceso Denegado o error en red al Intentar mostrar archivo

Estoy desarrollando una aplicación Java Web App montada en Apache Tomcat 8.0.27. Tanto en el navegador Internet Explorer y Google Chrome, me lanzan errores cuando intento mostrar algún archivo que tengo depositado localmente en mi máquina.

Las posibles descargas que puedes realizar en la aplicación son PDF o XML. Yo lleno dinámicamente una tabla de datos en el que los botones tienen las rutas a los archivos.

introducir la descripción de la imagen aquí

Los botones tienen las siguientes rutas:

C:\PortalLeal\algun.pdf ó C:\PortalLeal\algun.xml

Pero al momento de darles click a cualquier botón, me lanza los siguientes mensajes de error:

Este es el mensaje de error en Chrome: introducir la descripción de la imagen aquí

Este es el mensaje de error en Internet Explorer: introducir la descripción de la imagen aquí

La forma en la que yo lleno la tabla desde Java es esta, donde yo valido si es que en la base de datos el registro tiene: Ambas rutas (PDF, XML), solo la ruta PDF o solo XML, y en base a eso, lleno la tabla:

if(null != fac.getRutaPDF() && !fac.getRutaPDF().equalsIgnoreCase("") && null != fac.getRutaXML() && !fac.getRutaXML().equalsIgnoreCase("")){
        root.addProperty("accion",
            (null != fac.getRutaPDF() ? " PDF" : "") +
            (null != fac.getRutaXML() ? " XML" : "")
        );
    } else if(null != fac.getRutaPDF() && !fac.getRutaPDF().equalsIgnoreCase("")){
        root.addProperty("accion",
            (null != fac.getRutaPDF() ? " PDF" : "")
        );
    } else if(null != fac.getRutaXML() && !fac.getRutaXML().equalsIgnoreCase("")){
        root.addProperty("accion",
            (null != fac.getRutaXML() ? " XML" : "")
        );
    }

Nota: Me percaté de algunos problemas al intentar mostrar los archivos, por lo que tuve que aplicar el .replace("\\", "\\\\") para que la ruta realmente fuera: C:\\PortalLeal\\algun.pdf

Las etiquetas ejecutan una rutina en javascript downloadURI(), que recibe desde parámetros la ruta completa (C:\\\\PortalLeal\\\\algun.pdf), y el nombre del archivo (algun.pdf).


(Este método es el que hace la magia para mostrar los archivos)

Realicé una prueba de subir manualmente un archivo a C:\\PortalLeal\\, y manualmente poner la ruta en algún registro de la base de datos y curiosamente algunas veces, sí que muestra el documento (solo en IExplorer), y lo muestra de la siguiente manera:

introducir la descripción de la imagen aquí

No sé si el problema lo esté dando ApacheTomcat o el navegador web, por los permisos en las carpetas de Windows.

4
задан 22.10.2016, 16:45
3 ответа

Благодаря @LuiggiMendoza я смог встречать решения:

Сначала производить Servlet для разряда:

<servlet>  
    <servlet-name>DownloadServlet</servlet-name>  
    <servlet-class>org.al.download.DownloadServlet</servlet-class>  
</servlet>
<servlet-mapping>  
    <servlet-name>DownloadServlet</servlet-name>  
    <url-pattern>/DownloadServlet</url-pattern>  
</servlet-mapping>

Потом в моем классе Java, который наполняет dinámicamente данные, приказал звонить этой формы Servlet:

if(null != fac.getRutaPDF() && !fac.getRutaPDF().equalsIgnoreCase("") && null != fac.getRutaXML() && !fac.getRutaXML().equalsIgnoreCase("")){
        root.addProperty("accion",
            (null != fac.getRutaPDF() ? "<a href=\"DownloadServlet?fileName="+nombreFilePDF+"\" class=\"btn red btn-xs tooltips\"><i class=\"fa fa-file-pdf-o\"></i> PDF</a>" : "") +
            (null != fac.getRutaXML() ? "<a href=\"DownloadServlet?fileName="+nombreFileXML+"\" class=\"btn green btn-xs tooltips\"><i class=\"fa fa-file-excel-o\"></i> XML</a>" : "")
        );
    } else if(null != fac.getRutaPDF() && !fac.getRutaPDF().equalsIgnoreCase("")){
        root.addProperty("accion",
            (null != fac.getRutaPDF() ? "<a href=\"DownloadServlet?fileName="+nombreFilePDF+"\" class=\"btn red btn-xs tooltips\"><i class=\"fa fa-file-pdf-o\"></i> PDF</a>" : "")
        );
    } else if(null != fac.getRutaXML() && !fac.getRutaXML().equalsIgnoreCase("")){
        root.addProperty("accion",
            (null != fac.getRutaXML() ? "<a href=\"DownloadServlet?fileName="+nombreFileXML+"\" class=\"btn green btn-xs tooltips\"><i class=\"fa fa-file-excel-o\"></i> XML</a>" : "")
        );
    }

Магия делает ее? fileName = "+ nombreFilePDF +"

Дав click в автоматическом он посылает меня servlet:

import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;

public class DownloadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        String fileName = request.getParameter("fileName");
        String filepath = "C:\\PortalLeal\\";
        response.setContentType("APPLICATION/OCTET-STREAM");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

        FileInputStream fileInputStream = new FileInputStream(filepath + fileName);

        File file = new File(filepath + fileName);
        if (file.exists()) {
            int i;
            while ((i = fileInputStream.read()) != -1) {
                out.write(i);
            }
            fileInputStream.close();
            out.close();
        } else {
            response.sendRedirect("uploadPDF.jsp"); 
        }
    }
}
2
ответ дан 24.11.2019, 12:59

Он не соглашается, потому что ресурсы (PDF / XML) находятся в папке, которая не является доступной для Веб сервера.

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

Для того, чтобы подать эти файлы PDF и XML, ты должен делать их доступными для Веб сервера уже будьте на Веб различном сервере, различном endpoint (внутри того же сервера), или внутри папок Веба app, который ты показываешь нам.

2
ответ дан 24.11.2019, 12:59
  • 1
    например, в этом случае xml и pdf я сохраняю их в C:\PortalLeal\algo.pdf или xml, что ты комментируешь, состоит в том, чтобы он сохранял их в: C:\Program Поля (x86) \Apache Программное обеспечение Foundation\Apache Tomcat 8.0.27\temp\15-PortalAcerosLeal\algunaCarpeta, для того, чтобы мой aplicaci и # 243; n имейте доступ к этим файлам? привет. – Elí Giacomelli 21.10.2016, 21:04
  • 2
    Нет, что ты должен делать, что сервер действительно " sirva" файлы, не, что ты снабжаешь ссылками их в твой жесткий диск, который в глаза browser является тем, что est и # 225; происходя. – rfrp 21.10.2016, 21:14
  • 3
    Если в *C:\Program Поля (x86) \Apache Программное обеспечение Foundation\Apache Tomcat 8.0.27\temp\15-PortalAcerosLeal* est и # 225; n твои файлы веб сайта, если функционировать, и # 225;. и #201; sto - это, чтобы отвечать на твой вопрос на делании доступными файлов для пользователей. Сейчас ты должен принимать во внимание безопасность этих файлов, так как могут получить доступ с misitioweb.com/algunaCarpeta/miarchivo.pdf к например – Freddy Hdz 21.10.2016, 21:40

Я вижу проблему, с которым ты выдвигаешь как решение. каковой состоит идея с Веб приложения в том, чтобы вручать соединение для файла к твоему локальному диску (c:)? Эта система не будет подавать тебя, если alguin больше он соглашается, так как никогда он не согласится на файлы.

Вкратце, Tomcat не соглашается на файл, если не, что твой browser и вероятно там есть ограничение.

В твоем коде javascript, к URI добавь один file:// вещь, что твой код начал создавать такой унифицированный указатель ресурса:

(null != fac.getRutaPDF() ? "<a onClick=\"downloadURI('file://"+fac.getRutaPDF().replace("\\", "\\\\")+"','"+nombreFilePDF+"');\" class=\"btn red btn-xs tooltips\"><i class=\"fa fa-file-pdf-o\"></i> PDF</a>" : "")

Также, в моем opnión делать это - неправильно а следовательно он показывал раньше.

1
ответ дан 24.11.2019, 12:59

Теги

Похожие вопросы