URGENTE - Upload renomeando o arquivo

19 respostas
A

Pessoas,

Eu tenho um problema aqui no servico que eu nunca fiz, acreditem... UPLOAD de arquivo...

Agora eu nao pretendo entender, pois eu tenho que resolver o problema, entao, nesse primeiro momento, eu gostaria da ajuda de voces para resolver esse problema.

Arrumei um codigo e to testando aqui, so que esta dando um erro, sera que alguem sabe pq???

Meu form:
<form method="get" name="form" id="form">   
<label for="arq">Arquivo:</label>   
<input type="file" name="arq" id="arq" size="25" tabindex="15" accesskey="2">   
<br>
<input type="button" name="TRANSMITIR" value="Transmitir Arquivo" onClick="return validaarquivo(form.arq.value)" tabindex="30">
</form>
Minha funcao validaarquivo:
function validaarquivo(campo)   
{   
   TamanhoString = campo.length;   
   extensao = campo.substr(TamanhoString - 4,TamanhoString);
   
   if (TamanhoString == 0 )   
   {   
      alert('Você precisa selecionar um arquivo antes de transmitir.');   
      return false;   
   }   
   else   
   {   
        var ext = new Array('.pdf');//adicione as extensões desejadas   
        for(var i = 0; i < ext.length; i++)   
        {   
            if (extensao == ext[i])   
            {   
                flag = "ok";   
                break;   
            }   
            else   
            {   
                flag = "erro";                                 
            }   
        }   
        if (flag=="erro")   
        {   
            alert("O tipo do arquivo precisa ser no formato PDF.")             
            document.form.arq.value="";               
            return false;   
        }   
   }   
   //caminhourl = "upload.jsp";   
   document.form.action = 'TesteUpload';   
   window.document.form.submit();   
   return true;   
}
E meu Servlet TesteUpload:
public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		DiskFileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setSizeMax(50000 * 1024 * 1024);

		try {
			List items = upload.parseRequest(request);
			
			// Processa os itens do upload
			Iterator iter = items.iterator();
			
			while (iter.hasNext()) {
				FileItem item = (FileItem) iter.next();

				if (item.getFieldName().equals("arq")) {

					String nome = item.getName();
					StringBuffer bn = new StringBuffer();
					bn.append("C:/temp/");
					bn.append(nome);
					File uploadedFile = new File(bn.toString());
					item.write(uploadedFile);
				}
			}

		} catch (FileUploadException fuex) {
			System.out.println(fuex.getMessage().toString());
		} catch (Exception ex) {
			ex.getMessage().toString();
		}
	}

O erro que ta dando é quando ele entra no TRY, logo na primeira linha... lendo: "List items = upload.parseRequest(request);"

Ele entra na excecao: "System.out.println(fuex.getMessage().toString());"

Gerando o seguinte erro:
"the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is null"

ME AJUUUDEM... heheh

Valeu!

19 Respostas

T

Tenta adcionar o seguinte no teu form

enctype=“multipart/form-data”

A

Testei aqui, deu o mesmo erro.

Na verdade, eu tinha lido em um forum que o cara retirou o enctype=“multipart/form-data” e tinha dado certo, por isso tava sem.

Mas tentei com multipart/form-data, multipart/mixed… Tudo da erro… Sempre entra na excecao…
:cry:

Valeu!

T

Muda esse teu catch para o seguinte

} catch (Exception ex) { ex.printStackTrace(); }

e posta aí o erro!

A

Erro:

org.apache.commons.fileupload.FileUploadBase$InvalidContentTypeException: the request doesnt contain a multipart/form-data or multipart/mixed stream, content type header is null

at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.(FileUploadBase.java:885)

at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:331)

at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:349)

at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)

at servlet.TesteUpload.doGet(TesteUpload.java:34)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

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:191)

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:293)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)

at java.lang.Thread.run(Unknown Source)
T

Uma coisa que eu percebi, o seu form não tem o atributo action!

<form action="/MinhaServlet">

e mude o valor do atributo method para post

A

thiago

Mudar o metodo get/post nao interfere nos dados neh?

Outra coisa, minha action eh chamada na funcao validaarquivo();

Valeu

R

Boa Tarde aspneto,

No form tem que adicionar o atributo enctype=“multipart/form-data” e sempre o method deve ser post…

Aqui no guj tem alguns links…
http://guj.com.br/posts/list/121604.java#657942
http://guj.com.br/posts/list/122228.java#661305

flw

T

aspneto:
thiago

Mudar o metodo get/post nao interfere nos dados neh?

Outra coisa, minha action eh chamada na funcao validaarquivo();

Valeu

Não, só mudará o método que eles seram enviados, a tua action deve ser a página/servlet que irá pocessar a sua requisição, para fazer validações utilize o atributo onSubmit do form

A

Mudei aqui pra POST e coloquei o enctype=“multipart/form-data”.

Agora deu o seguinte erro:

SEVERE: Servlet.service() for servlet TesteUpload threw exception

java.lang.ClassNotFoundException: org.apache.commons.io.output.DeferredFileOutputStream

at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)

at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)

at java.lang.ClassLoader.loadClassInternal(Unknown Source)

at org.apache.commons.fileupload.disk.DiskFileItemFactory.createItem(DiskFileItemFactory.java:196)

at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:358)

at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)

at servlet.TesteUpload.doPost(TesteUpload.java:31)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

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:191)

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:293)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)

at java.lang.Thread.run(Unknown Source)
L

Deve estar faltando o pacote que contem org.apache.commons.io.output.DeferredFileOutputStream no seu classpath.

se nao me engano essa classe faz parte do fileupload…

http://commons.apache.org/fileupload/

A

Eu desconfiei disso, abri o JAR que vem do FileUpload, ele realmente nao vem com essa classe:
org/apache/commons/io/output/DeferredFileOutputStream

Ele so tem uma pasta das classes que é:
org/apache/commons/fileupload/…

Nao tem esse pacote IO…

Alguem tem ele ai???

Abracos

L

vou procurar e te falo…eu ja tive o mesmo problema que vc…achei num site por ai…rs

mas baixa a ultima versão e dá uma olhada…

olha, aqui tem um link pra download…
http://jar.fyicenter.com/35_General_commons-io-1.4.jar_Apache_Commons_IO_1.4.html

A

Gente, muito bom esse forum aqui... Bom mesmo...

Luciene, muito obrigado pela ajuda, era isso mesmo, baixei a classe e rodou aqui...

Vou postar os codigos para consulta futura.

Valeu!!!

Alvaro Neto.

Minha index.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<script type="text/javascript">   
function validaarquivo(campo)   
{   
   TamanhoString = campo.length;   
   extensao = campo.substr(TamanhoString - 4,TamanhoString);
   
   if (TamanhoString == 0 )   
   {   
      alert('Você precisa selecionar um arquivo antes de transmitir.');   
      return false;   
   }   
   else   
   {   
        var ext = new Array('.pdf');//adicione as extensões desejadas   
        for(var i = 0; i < ext.length; i++)   
        {   
            if (extensao == ext[i])   
            {   
                flag = "ok";   
                break;   
            }   
            else   
            {   
                flag = "erro";                                 
            }   
        }   
        if (flag=="erro")   
        {   
            alert("O tipo do arquivo precisa ser no formato PDF.")             
            document.form.arq.value="";               
            return false;   
        }   
   }   
   //caminhourl = "upload.jsp";   
   document.form.action = 'TesteUpload';   
   window.document.form.submit();   
   return true;   
}   
</script>   


<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Teste</title>
</head>
<body>

<!--Formulário-->     
	<form method="post" name="form" id="form" enctype="multipart/form-data" >   
    	<label for="arq">Arquivo:</label>   
      	<input type="file" name="arq" id="arq" size="25" tabindex="15" accesskey="2" ContextHelp="Entre com o nome do arquivo ou utilize o botão brouse (pesquisar) ao lado." title="Digite a localização do arquivo ou utilize o botão Browse (pesquisar) para localizar. Para utilizar o botão Browse via teclado com o Internet Explorer, pressione a tecla espaço com o botão selecionado.">   
      	<br>
      	<input type="button" name="TRANSMITIR" value="Transmitir Arquivo" onClick="return validaarquivo(form.arq.value)" tabindex="30">
	</form>
</body>
</html>

Minha Servlet TesteUpload:

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

		DiskFileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setSizeMax(50000 * 1024 * 1024);

		try {
			List items = upload.parseRequest(request);
						
			// Processa os itens do upload
			Iterator iter = items.iterator();
			
			while (iter.hasNext()) {
				FileItem item = (FileItem) iter.next();

				if (item.getFieldName().equals("arq")) {

					String nome = item.getName();
					nome = new File(nome).getName();
					
					StringBuffer bn = new StringBuffer();
					bn.append("C:\\temp\\");
					bn.append(nome);
					File uploadedFile = new File(bn.toString());
					item.write(uploadedFile);
				}
			}

		} catch (FileUploadException fuex) {
			fuex.printStackTrace();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
A

Aproveitando o assunto, surgiu uma outra coisa aqui.

Eu to querendo enviar para a servlet, o nome do usuario, que se encontra em um hidden.

Quando eu envio o arquivo, o download acontece normalmente, MAS… meu hidden vai null…

Alguem saberia pq?

T

Depende de como você está pegando o valor, não request.getParameter e sim requet.getAttribute :wink:

A

Mesmo usando o getAttribute, o valor esta vindo null.

No JSP eu to pegando o valor assim:

é isso mesmo ne?

R

aspneto:
Mesmo usando o getAttribute, o valor esta vindo null.

No JSP eu to pegando o valor assim:

é isso mesmo ne?

Amigo Demoro mas a resposta veio…
Tive o problema que a sua pergunta me solucionou da foto e esse seu problema ai é pq como você está enviando uma foto o getparameter não existe mais…
você deve colocar tudo que vc quer dentro do action
exemplo:

FORM ENCTYPE='multipart/form-data' method='POST' 
action='Controlador?name='"+ usuario.getNome + "' name='controlador'>

Todos os Parametros devem ser passados dentro do Action agora.
abraço :smiley:

R

Só pra tirar o 24 msgs dali huauhahua
abraço

A

Rodrigo, resolvido cara, valeu mesmo!!!

Abracos a todos que me ajudaram!!!

Criado 18 de janeiro de 2010
Ultima resposta 19 de jan. de 2010
Respostas 19
Participantes 5