URGENTE - Upload renomeando o arquivo

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:

[code]
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;
}[/code]

E meu Servlet TesteUpload:

[code]
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();
	}
}[/code]

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!

Tenta adcionar o seguinte no teu form

enctype=“multipart/form-data”

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!

Muda esse teu catch para o seguinte

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

e posta aí o erro!

Erro:

org.apache.commons.fileupload.FileUploadBase$InvalidContentTypeException: the request doesn’t 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)

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

thiago

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

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

Valeu

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

[quote=aspneto]thiago

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

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

Valeu[/quote]

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

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)

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/

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

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

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:

[code]<%@ page language=“java” contentType=“text/html; charset=ISO-8859-1”
pageEncoding=“ISO-8859-1”%>

Teste
<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>
[/code]

Minha Servlet TesteUpload:

[code]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();
	}
}[/code]

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?

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

Mesmo usando o getAttribute, o valor esta vindo null.

No JSP eu to pegando o valor assim:

é isso mesmo ne?

[quote=aspneto]Mesmo usando o getAttribute, o valor esta vindo null.

No JSP eu to pegando o valor assim:

é isso mesmo ne?[/quote]

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:

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

Rodrigo, resolvido cara, valeu mesmo!!!

Abracos a todos que me ajudaram!!!