entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

¿Cómo bloquear la tecla ESC en Jsp con JavaScript?

Buenas tardes a todos.

He estado observando que, al realizar una subida de archivos dentro del servidor, es posible cancelar la carga de la información
con sólo presionar la tecla ESC, ocasionando una pérdida de información del lado de la carpeta repositorio del Servidor.

He investigado un poco acerca del tema, y encontré un script que justamete permite deshabilitarlo:

<script src="http://www.openjs.com/scripts/events/keyboard_shortcuts/shortcut.js" type="text/javascript"></script>

éste se implementa de la siguienet forma:

<script type='text/javascript'>
   if(top.location != self.location)
        top.location = self.location;</script>

<script type='text/javascript'>
  shortcut.add('ESC',function() { });  

  </script>

Aunque no funciona en el index principal.

¿Hay alguna otra forma de evitar presionar ESC durante la carga de un archivo?
¿Habrá un error sintáctico que no encuentre?

Por su amable atención, muchas gracias.

2 Respuestas

2votos

x4mp73r Puntos13390

Esto permite manejar la tecla ESC, en este caso, manda una alerta, diciendo que ah sido presionado:

document.querySelector("input").addEventListener("keydown",function(e){
    console.log(e.which);
    if (e.which == 27){
         alert("Escape pressed!");
        return false;
    }
});

Demo

0voto

pWolfman_furry29 comentado

Gracias por tu respuesta @x4mp73r .
Efectivamente puedo ver que agregas un evento denominado "Keydown" que responde
al código de la tecla presionada (esc=27).

Me resulta útil este código para adecuarlo de modo que no se realice ninguna acción en el formulario.
Muchas gracias .

1voto

white Puntos75880

Si hay la posibilidad, pienso yo que sería algo intrusivo para el usuario, el cliente debe tener la posibilidad de cancelar si así lo desea, creo que deberías controlarlo desde el servidor.

de que forma se pierde información del lado del servidor?

debes comprobar si el archivo ha sido subido, el tamaño del fichero podría ser 0 si no se subió o fue cancelado.

if ( el fichero temporal existe && tamaño del fichero > 0 ) {
    // cargar a la base de datos
    // copiar el archivo temporal al servidor
}

intenta darnos él código de como manejas la subida de tus ficheros.

0voto

pWolfman_furry29 comentado

Ciertamente concuerdo contigo @white, sin embargo, es un requerimiento que el módulo que estoy desarrollando debe de cubrir.

El código que estoy empleando para realizar la subida al servidor es el siguiente:

package Contenedor;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;  
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("/AltaArchivo")//Nombre del Servlet
@MultipartConfig(fileSizeThreshold=1024*1024*50,    // 50 MB /*Tamaños máximos de entrada,y config de Multipart Form*/
                 maxFileSize=1024*1024*100,          // 100 MB
                 maxRequestSize=1024*1024*300)      // 300 MB
public class AltaArchivo extends HttpServlet {
/********************VARIABLES A USAR*****************************/  
    private static final long serialVersionUID = 205242440643911308L;     
    private static final String UPLOAD_DIR = "uploads";   

    @Override

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out=response.getWriter();      

        /*Primero almaceno en ua variable la ruta Absoluta del proyecto(Path)*/
        String applicationPath = request.getServletContext().getRealPath("");

         String uploadFilePath=applicationPath+"\\RepositorioArchivo";//Hago una variable que cree un repositorio en la ruta(Path) 
        File fileSaveDir = new File(uploadFilePath);//Creamos un objeto de tipo File que define el path de subida de archivos
        if (!fileSaveDir.exists()) {//En caso de no existir
            fileSaveDir.mkdirs();//Se crea con el método mkDirs()
        }

        String fileName = null;//Esta variable recupera el nombre del archivo seleccionado
        for (Part part : request.getParts()) {//Se hace una iteración con un objeto de tipo Part que recupera cada fragmento del archivo seleccionado
            fileName = getFileName(part);//Para hacer el nombrado del archivo, se usa el Método getFileName(part)        
            part.write(uploadFilePath + File.separator + fileName);//Se reintegran los fragmentos del archivo con el nombre         

        }

    }

    private String getFileName(Part part) {//éste método permite recupera el nombre origial del archivo seleccionado en el formulario

        String contentDisp = part.getHeader("content-disposition");
        System.out.println("content-disposition header= "+contentDisp);
        String[] tokens = contentDisp.split(";");
        for (String token : tokens) {
            if (token.trim().startsWith("filename")) {
                return token.substring(token.indexOf("=") + 2, token.length()-1);               
            }
        }
        return "";
    }

    }  

Antes de llegar al servlet, la información debe de pasar por el formulario en JSP para recibir el archivo, es por ello que(Corrijánme si estoy equivocado) me imagino que desde el mismo es necesario tener el menanismo que impida cancelar la subida del archivo.

Por otra parte, y mediante el código que tengo, ¿Cómo puedo validar si el archivo no tiene información?

if(fileName.length()>0&&fileSaveDir.exists()){
     //Resto de código       
}

0voto

white comentado

suponiendo que tienes servlet >= 3

entonces con algo así bastaría:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");

    getServletContext()
            .getRequestDispatcher("/formulario.jsp")
            .forward(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    String uploadPath = request
            .getServletContext()
            .getRealPath("/uploads");

    ArrayList<String> allowedMimetypes = new ArrayList<>();

    allowedMimetypes.add("application/vnd.ms-excel");
    allowedMimetypes.add("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

    // el archivo no fue enviado
    if (request.getParts().isEmpty()) {
        request.setAttribute("error", "El campo 'archivo' es necesario.");
        this.processRequest(request, response);
        return;
    }

    // archivo .xls|.xlsx
    Part filePart = request.getPart("archivo");
    String filename = filePart.getSubmittedFileName();

    if (filePart.getSize() == 0 || filename.isEmpty()) {
        request.setAttribute("error", "No se ha subido el archivo.");
        this.processRequest(request, response);
        return;
    }

    if (!allowedMimetypes.contains(filePart.getContentType())) {
        request.setAttribute("error", "Archivo inválido.");
        this.processRequest(request, response);
        return;
    }

    // error el archivo no tiene una extension valida
    if (!filePart.getSubmittedFileName().endsWith(".xls") &&
        !filePart.getSubmittedFileName().endsWith(".xlsx")) {
        request.setAttribute("error", "Extension invalida.");
        processRequest(request, response);
        return;
    }

    String filePath = uploadPath + File.separator + filename;
    File fileUpload = new File(filePath);

    if (!fileUpload.exists()) {
        fileUpload.getParentFile().mkdirs();
        fileUpload.createNewFile();
    }

    filePart.write(filePath);

    request.setAttribute("error", "subido satisfactoriamente");

    processRequest(request, response);
}

de esta forma válidas el archivo, el mime type y su extensión en el servidor, recuerda que debes validarlo de ambos lados, en el servidor y en el cliente, si solo lo haces en el cliente, podrías tener problemas.

asumo que tienes tu formulario en un jsp, "formulario.jsp". ahí podrías mostrar un mensaje de error o éxito en la subida.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta