IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GWT et Vaadin Java Discussion :

[Problème] AccessControlException : comment lire des fichiers en local ?


Sujet :

GWT et Vaadin Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Par défaut [Problème] AccessControlException : comment lire des fichiers en local ?
    Bonjour à tous et merci pour votre attention.

    J'utilise gwt, pour créé une application web. Cette application (côté client) a un file upload comme widget dans un form, pour pouvoir uploadé des fichiers excel et les lire pour en soutirer leur contenu (et les traiter ensuite).

    J'ai donc créér une servlet et un service qui devrait me permettre de faire ce que je viens de dire.

    Le problème c'est que j'ai cette erreur quand je veux uploader un fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.security.AccessControlException: access denied (java.io.FilePermission /tmp/test.xls read)
    Les données semblent ainsi être protégés et ne sont pas lues... Donc si jamais vous avez une idée sur la question ça m'aiderait beaucoup (normal hein ^^).

    Je vous donne le code de la servlet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    package com.pv.terence.gui.GlocGuiHomepage.server.servlet;
     
    import java.io.File;
    import java.io.IOException;
    import java.util.List;
     
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileItemFactory;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
     
    public class FileXLSStorePoi extends HttpServlet {
     
    	public static String RESOURCE_DIR = "/tmp";
        String url;
     
    	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		System.out.println("Entrer dans service servlet");
            System.out.println("requete existante : " + req.getQueryString());
    		uploadFile(req, resp);
     
    	}
     
    	/**
             * The following method uploads the xls file and calls the callXLSReader
             * @param req
             * @param resp
             * @return
             */
    	public void uploadFile(HttpServletRequest req, HttpServletResponse resp) {
     
    		System.out.println("Je suis dans uploadFile");
            String relativePath = null;
     
            // Create a factory for disk-based file items
            FileItemFactory factory = new DiskFileItemFactory();
     
            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);
     
            String contents = null;
     
            // Parse the request
            try {
                List /* FileItem */ items = upload.parseRequest(req);
                for (int i = 0; i < items.size(); i++) {
                    FileItem fileItem = (FileItem) items.get(i);
                    if (fileItem.isFormField()) {
                        // well, the relativePath better come first... (to be considered if random uploads fail)
                        if (fileItem.getFieldName().equals("filename")) {
                            relativePath = fileItem.getString();
                            System.out.println("relative path : " + relativePath);
                        }
                    }
                    else {
                        String fileName = this.basename(fileItem.getName());
                        System.out.println("File name : " + fileName);
                        File uploadedFile = new File(RESOURCE_DIR + File.separator + relativePath, fileName);
                        System.out.println("Path " + RESOURCE_DIR + File.separator + relativePath);
                        uploadedFile.mkdirs();
                        uploadedFile.delete();
                        uploadedFile.createNewFile();
                        fileItem.write(uploadedFile);
                        url=uploadedFile.getAbsolutePath();
                    }
                }
                System.out.println(" url="+url);
            } catch (FileUploadException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
     
            callXLSReader(url, resp);
     
    	}
     
    	/**
         * IE doesn't follow the RFC and sends file names as complete paths.
         * This method trims it back to the file name (as it is supposed to be).
         */
        public String basename(String name) {
            // We look for the last '\\' or '/'
            name = name.replace('\\', '/');
            int index = name.lastIndexOf('/');
            if (index >= 0) {
                return name.substring(index+1);
            }
            return name;
        }
     
    	public void callXLSReader(String url, HttpServletResponse resp){
     
                    //je créé le service et je lance la méthode de traitement
    		com.pv.terence.gui.GlocGuiHomepage.server.ImportPoiListServiceImpl service = new com.pv.terence.gui.GlocGuiHomepage.server.ImportPoiListServiceImpl();
    		System.out.println("URL="+url);
    		service.loadPoiList(url);
    		resp.setContentType("text/html");
     
    	}
     
    }
    Merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2009
    Messages : 36
    Par défaut
    Salut,

    D'aprés le chemin que je voit que tu utilise, je crois que tu travaille sur Linux.

    vérifié que tu as le droit d'ecriture dans /tmp, ou essaye de sauvegarder dans un autre dossier...

    voici un exemple de code pour sauvegarder un fichier (il faut adapter les separateur systeme):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
     
    		/*
    		 * The following commented code uses Apache Commons Upload
    		 */
     
    		// Check that we have a file upload request
    		boolean isMultipart = ServletFileUpload.isMultipartContent(req);
     
    		// Create a new file upload handler
    		ServletFileUpload upload = new ServletFileUpload();
     
    		try{
    		// Parse the request
    		FileItemIterator iter = upload.getItemIterator(req);
    		while (iter.hasNext()) {
    		    FileItemStream item = iter.next();
    		    String name = item.getFieldName();
    		    InputStream stream = item.openStream();
    		    if (item.isFormField()) {
    		        System.out.println("Form field " + name + " with value "
    		            + Streams.asString(stream) + " detected.");
    		    } else {
     
     
    		    	String fileName = item.getName(); 
    				int slash = fileName.lastIndexOf("/"); 
    				if (slash == -1) { 
    					slash = fileName.lastIndexOf("\\"); 
    				}
    				if (slash != -1) { 
    					fileName = fileName.substring(slash + 1);
    				} 
    				System.out.println("fileName " + fileName);
    		        System.out.println("File field " + name + " with file name "
    		            + item.getName() + " detected.");
    		        // Process the input stream here
    		        InputStream uploadedStream = item.openStream();
    		        // save to file system now...
    		        File uploadedFile = new File("c:/temp/"+fileName);
    		        FileOutputStream fos = new FileOutputStream(uploadedFile);
    		        byte[] myarray = new byte[500];
    		        int i = 0;
    		        while((i = uploadedStream.read(myarray))!=-1){
    		        	fos.write(myarray, 0, i);	        	
    		        }
    		        fos.flush();
    		        fos.close();
    		        uploadedStream.close();
    		    }
    		}
    		}catch(Exception ex){
    			ex.printStackTrace();
    		}
     
    	}

  3. #3
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Par défaut
    Merci pour ta réponse,

    Le problème c'est que je n'ai pas les permissions pour lire ou écrire un fichier xls que je veux uploader.
    J'ai créé un fichier res dans tmp : le path est donc /tmp/res

    J'ai mis tous les droits (chmod 777 à res, c'est déjà le cas pour tmp) concernant ces deux répertoires.

    J'ai un peu modifier le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    public void uploadFile(HttpServletRequest req, HttpServletResponse resp) throws IOException {
     
    		String content =  null;
    		System.out.println("Upload file method");
     
    		//Create a factory for disk-based file items
    		FileItemFactory factory = new DiskFileItemFactory();
     
    		//Create a new file upload handler
    		ServletFileUpload upload = new ServletFileUpload(factory);
     
    		//Parse the request
    		try {
    			List items = upload.parseRequest(req);
     
    			for (int i = 0; i < items.size(); i++) {
    				FileItem fileItem = (FileItem) items.get(i);
     
    				if(fileItem.isFormField()) {
    					if (fileItem.getFieldName().equals("siteId")) {
    						siteId = Integer.valueOf(fileItem.getString());
    						System.out.println("The site is : " + siteId);
    					}
    				}
    				else {
    					content = fileItem.getString();
    					System.out.println("Content : " + content);
    					String fileItemName = this.basename(fileItem.getName());
    					System.out.println("The file item name : " + fileItemName);
    					File uploadedFile =  new File (RESSOURCE_DIR + File.separator, fileItemName);
    					System.out.println("Uploaded File : " + uploadedFile.toString());
    					uploadedFile.mkdirs();
    					uploadedFile.delete();
    					uploadedFile.createNewFile();
    					fileItem.write(uploadedFile);
     
    					String url = uploadedFile.getAbsolutePath();
    					xlsUrl = url;
    					System.out.println("The complete URL fot the XLS file uploaded is : " + xlsUrl);
    				}
    			}
    			//
    			//
    			if (xlsUrl.contains(".xls") || xlsUrl.contains(".XLS")) {
    				if (parseXLS()) {
    					saveData();
    				}
    			}
    			else parseReport += "**ERROR Please Check the File Format!! (xls or csv)";
    		}
    		catch (Exception e) {
    			e.printStackTrace();
    		}
     
    		resp.setContentType("text/plain");
    		PrintWriter out = resp.getWriter();
    		out.flush();
    		out.write(parseReport);
    		out.close();
     
    	}
    Mais voila j'ai toujours la même erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.security.AccessControlException: access denied (java.io.FilePermission /tmp/res/test.xls write)
    ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.security.AccessControlException: access denied (java.io.FilePermission /tmp/res/test.xls read)
    Il n'y pas moyen de forcer l'écriture/lecture ?

    Merci pour vos réponses !

  4. #4
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    C'est à priori un problème système, il faut que ta jvm ait le droit d'écrire sur le disque à l'endroit que tu souhaites.

    Voir sur les forums Système Linux et/ou Java Server.

Discussions similaires

  1. Comment lire des fichiers mp3
    Par crashtib dans le forum Multimédia
    Réponses: 3
    Dernier message: 04/12/2009, 18h10
  2. Comment lire des fichiers mp3, wav et video ?
    Par Klemsy78 dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 11/12/2007, 11h34
  3. [Excel] Comment lire des fichiers excel avec php?
    Par dear_rihab dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 02/11/2007, 12h38
  4. comment lire des fichiers binaires
    Par compton dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 06/07/2006, 12h03
  5. Comment lire des fichiers d'extension src ?
    Par compton dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 04/07/2006, 16h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo