Problemas em abrir um Diretorio[Resolvido]

11 respostas
R

Ola pessoal , estou implementando um Servlet que fará Upload de arquivos estou usando API FileUpload mas estou passando por um problema cômico :stuck_out_tongue:
O diretorio que quero abrir é abcd
O interessante que faço uma checagem se o dir existe e se ele não está habilitado para escrita , fiz ate um teste deletei o dir abcd fiz a request para “upar” o arquivo ele criou o dir abcd mas ao tentar abrir o abcd ele lança essa Exception abaixo:

ja mudei os atributos do diretorio para escrita ;;; meu servidor é Windows

Exception:

java.io.FileNotFoundException: C:\xxx\www\wwwroot\abc\abcd (Acesso
negado)
        at java.io.FileOutputStream.open(Native Method)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
        at applications.rh.ImportStockOptions.doPost(ImportStockOptions.java:95)

Lendo o javadoc me trouxe a seguinte informação na classe FileOutputStram:

Throws:
    FileNotFoundException - if the file exists but is 
a directory rather than a regular file, 
does not exist but cannot be created, or cannot
be opened for any other reason

Não entendi muito bem o que seria se o diretorio rather than a regular file
E no final ele diz que o arquivo não pode ser aberto por algum outro motivo

Alguem ja passou por este problema?

11 Respostas

W

Você pode pegar dados do diretório como por exemplo listar os arquivos que existem dentro dele ex :
File r = new File("/dir/dir/dir");
File a[] = r.listFiles(); // Retorna a lista de arquivos do diretório

Por que você abriria um diretório ?

D

Posta o código ai :smiley:

Eu usei a FileUpload sexta-feira e funcionou normal. Será que cc está usando um diretório onde deve ser um arquivo?

Até mais!

R

A forma que estou fazendo:

// TODO Auto-generated method stub
		boolean isMultipart =  ServletFileUpload.isMultipartContent(request);
		
		if (isMultipart)
		{
			// Create a factory for disk-based file items
			FileItemFactory factory = new DiskFileItemFactory();

			// Set factory constraints
			//factory.setSizeThreshold(1000);
			
			// Create Temp Repository
			//File fileTemp = new File("c:\\Temp");
			//factory.setRepository(fileTemp);
           
			// Create a new file upload handler
			ServletFileUpload upload = new ServletFileUpload(factory);

			// Set overall request size constraint  in bytes
			upload.setSizeMax(400000);

			// Parse the request
			try
			{
				List /* FileItem */ items = upload.parseRequest(request);
				Iterator it = items.iterator();
				while (it.hasNext())
				{
					FileItem item = (FileItem) it.next();
					if (!item.isFormField())
					{
					    String cam = this.getServletContext().getRealPath("rh")+"\\stockoptions";
					    System.out.println("Cam "+cam);
					    
					    File file = new File(cam);
					    
					    if (!file.exists())
					    	file.mkdir();
					    if (file.exists())
					    {	
					    	if (file.isDirectory())
					    	{
					    		if (file.canWrite())
					    		{
					    			item.write(file);
					    		}
					    		else
					    			System.out.println("O arquivo nao pode ser escrito");	
					    	}
					    }
					    else
					    	System.out.println("O diretorio nao existe");
					}
				}

Então objeto cam = recebe o diretorio no servidor onde será armazenado o arquivo no momento que chamo item.write(file) ele lança a Exception

Estou usando o Tomcat 3.2 tentei colocar um policy no tomcat.plicy dizendo que nesse diretorio tem a permissao de escrita mas mesmo assim não funcionou …

Ps: Desprezem os dois posts abaixo …

R
R
D

Estou indo para o serviço, as 12:30 eu te mando o meu código e leio o seu com mais calma.

Abraço!

D

Olha, meu código é quase idêntico ao seu, mas funcionou sem problemas.
Dê uma olhada. Ele no caso obtém todos os outros campos do formulário que não são input file e cria o nome do arquivo e depois pega os dois últimos campos do formulário que são os input files.

// Cria uma fábrida para items de arquivo baseado em disco
DiskFileItemFactory factory = new DiskFileItemFactory();

// configura as restrições da fábrica
factory.setSizeThreshold( 1 ); // limite para arquivo em memória
factory.setRepository( new File( "C:/www/Intranet/SGP/AvaliacaoInstitucional/temp/" ) ); // seta o repositório temporário do arquivo

// Cria um novo manipulador de envio de arquivo
ServletFileUpload upload = new ServletFileUpload( factory );

// seta a restrição de tamanho do arquivo (20 MB)
upload.setSizeMax( 20971520 );

try {

    // analisa o request
    List items = upload.parseRequest( request );

    StringBuilder nomeDoArquivo = new StringBuilder();

    int cont = 0;

    for ( int i = 0; i < items.size(); i++ ) {

        FileItem item = ( FileItem ) items.get( i );

        // se for um campo de formulário
        if ( item.isFormField() ) {

            nomeDoArquivo.append( item.getString() + "_" );

            // é o arquivo em 
        } else {

            File uploadedFile = null;

            if ( cont == 0 ) 
                uploadedFile = new File( "C:/www/Intranet/SGP/AvaliacaoInstitucional/" + 
                        nomeDoArquivo + "Relatorio.pdf" );
            else
                uploadedFile = new File( "C:/www/Intranet/SGP/AvaliacaoInstitucional/" + 
                        nomeDoArquivo + "Grafico.pdf" );

            cont++;

            try {

                item.write( uploadedFile );

            } catch ( Exception exc ) {

                exc.printStackTrace();

            }

        }

    }

} catch ( FileUploadException exc ) {

    exc.printStackTrace();

}

Até mais!

R

Ola David qual versao tomcat que vc esta utilizando?

Meu codigo nao tem nada de diferente do seu …

D

Realmente, como falei o código não tem diferença… Uso o tomcat 5.5

Até mais!

R

Cara resolvi meu problema acho que no momento que executava o item.write(repositorio) ele confundia que o repositorio era uma arquivo por isso negava o acesso;
A solução

if (file.canRead())
{	
	String fileName = item.getName();
	if (fileName != null) 
        {
	   fileName = FilenameUtils.getName(fileName);
	   item.write(new File(cam+"\\"+fileName));
        }

Obrigado pela ajuda

D

Beleza!

Criado 13 de agosto de 2007
Ultima resposta 15 de ago. de 2007
Respostas 11
Participantes 3