Commons FileUpload - Acesso Negado

Pessoal, bom dia…

Estou tentando fazer o upload de arquivos utilizando o commons-fileupload e estou com problemas para escrever os arquivos.
Primeiramente eu pego o caminho de um arquivo da máquina do usuário, depois gravo este arquivo numa pasta dentro do meu WEB-INF para posterior leitura…

Estou fazendo a leitura de arquivos da seguinte maneira dentro da minha servlet

protected void executeUpload(HttpServletRequest request) throws ServletException, IOException, FileUploadException {
		if (ServletFileUpload.isMultipartContent(request)) {
			DiskFileItemFactory factory = new DiskFileItemFactory();
			factory.setRepository(new File(getServletConfig().getServletContext()
										.getRealPath("/WEB-INF/uploadFiles/")));			
			
			ServletFileUpload upload = new ServletFileUpload(factory);
			upload.setSizeMax(50*1024*1024); //50MB
			
			List itemsList = upload.parseRequest(request);
			System.out.println("Número de arquivos " + itemsList.size());
			
			for (Object object : itemsList) {
				FileItem item = (FileItem) object;
				try {
					item.write(factory.getRepository());
				} catch (Exception e) {					
					e.printStackTrace();
				}
			}
		}
	}

No entanto, ao executar este código ele lança uma FileNotFoundException…
Segue o stack:

java.io.FileNotFoundException: C:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\SirsUpdateDatabase\WEB-INF\uploadFiles (Acesso negado)
	at java.io.FileOutputStream.open(Native Method)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at org.apache.commons.fileupload.disk.DiskFileItem.write(DiskFileItem.java:439)
	at com.telefonica.sirs.update.controller.MainServlet.executeUpload(MainServlet.java:169)
	at com.telefonica.sirs.update.controller.MainServlet.doProcess(MainServlet.java:53)
	at com.telefonica.sirs.update.controller.MainServlet.doPost(MainServlet.java:45)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)

Já tentou dar permissão de escrita na pasta uploadFiles?

A permissão tem que ser dada para qual usuário?
O usuário local da máquina?

PS: Ainda estou executando essa aplicação localmente

A permissão tem que ser dada para o usuário que o roda o Tomcat. Na visão do sistema operacional quem quer escrever algo naquele diretório é o Tomcat (mais especificamente a VM que roda o tomcat)

Hum, me desculpe se a dúvida é mto idiota, mas como que vou essa permissão para a VM que roda o TomCat?

Você da permissão ao usuário que roda ele.
Por exemplo se você iniciou o tomcat com o usuario Vitor, vc tem que adicionar nas permissões de escrita da pasta o usuario Vitor.

Hum… entendi… mas isso eu já estou fazendo.
O meu usuário é administrador da máquina e já dei a permissão para ele… (naquela aba de segurança do windows)…

Dei controle total tanto na pasta do workspace, qto na pasta que ele mostra no stacktrace…

Tenta gravar no C: diretamente.

Tomara que você não seja um feliz usuário do Windows Vista :slight_smile:

verifique na aba Log On das configurações do Tomcat qual é o usuário… se você não mexeu nesta configuração, não deve ser a conta Administrador.

abraço.

Tentei gravar no C: diretamente e também deu acesso negado… (uso o Windows XP)

Não sei mais oq pode ser isso…

Pessoal, obrigado pelas dicas e pelos toques.
Consequi resolver da seguinte maneira:

(Dando um nome para o arquivo que ele irá salvar)

protected void executeUpload(HttpServletRequest request) throws ServletException, IOException, FileUploadException {  
        if (ServletFileUpload.isMultipartContent(request)) {  
            DiskFileItemFactory factory = new DiskFileItemFactory();  
            factory.setRepository(new File(getServletConfig().getServletContext()  
                                        .getRealPath("/WEB-INF/uploadFiles/")));              
              
            ServletFileUpload upload = new ServletFileUpload(factory);  
            upload.setSizeMax(50*1024*1024); //50MB  
              
            List itemsList = upload.parseRequest(request);  
            System.out.println("Número de arquivos " + itemsList.size());  
              
            for (Object object : itemsList) {  
                FileItem item = (FileItem) object;  
                try {  
                    item.write(new File(factory.getRepository().getName() + "text.txt"));  
                } catch (Exception e) {                   
                    e.printStackTrace();  
                }  
            }  
        }  
    }

No entanto, estou com outro problema.
Nesse form que eu passo o input type=file, eu também tenho outros parâmetros que eu preciso pegar via request…

Se eu dou um getParameter, ele sempre me retorna null…
No entanto, eu percebi que o for que eu coloquei, é executado 3 vezes pois eu tenho outros dois parâmetros vindos da request…

Como faço para pegar esses outros dois parâmetros?

Simples! Voce pode fazer assim.

for (Object object : itemsList) {     
                FileItem item = (FileItem) object;
                //aqui so vai entrar nesse if se for qualquer parametro diferente de FILE
                if(item.isFormField()){
                     String nomeParametro=item.getFieldName();
                     String valorParametro=item.toString();
                }
               //e nesse else so vai escrever os parametros file 
               else{
                  try {     
                    item.write(new File(factory.getRepository().getName() + "text.txt"));     
                  } catch (Exception e) {                     
                    e.printStackTrace();     
                  }
               }     
            }     

Espero ter ajudado

Muito obrigado cara! Funcionou perfeitamente! Obrigado a todos do GUJ pelos esclarecimentos!