Olá.
Pense na seguinte URL como exemplo: http://www.exemplo.com/application/modules/static/img/
Neste diretório ficam armazenadas diversas imagens.
Preciso criar um aplicativo que faça upload de imagens e estas devem ir para o diretório acima (dentro da pasta ‘img’).
Tem como fazer isso ou só é possível via FTP? Como fazer?
Tem sim.
Qualquer linguagem de programação possui mecanismos que te permitem fazer isso.
Atualmente estou usando o componente fileUpload do PrimeFaces. Veja o meu bean:
public void handleFileUpload(FileUploadEvent event) throws IOException {
byte[] data = event.getFile().getContents();
HttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost("http://www.exemplo.com/application/modules/static/img/");
ByteArrayBody bab = new ByteArrayBody(data, event.getFile().getFileName());
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart("uploadingFile", bab);
postRequest.setEntity(reqEntity);
HttpResponse response = httpClient.execute(postRequest);
}
Porém quando chega na linha ‘HttpResponse response = httpClient.execute(postRequest);’ ocorre a seguinte exceção:
WARNING: /upload.xhtml @75,47 fileUploadListener="#{bebeController.handleFileUpload}": java.net.SocketException: Connection reset
javax.el.ELException: /upload.xhtml @75,47 fileUploadListener="#{bebeController.handleFileUpload}": java.net.SocketException: Connection reset
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:111)
at org.primefaces.component.fileupload.FileUpload.broadcast(FileUpload.java:279)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:760)
at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:936)
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:166)
at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:90)
at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:281)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:92)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127)
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:715)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:520)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)
at control.BebeController.handleFileUpload(BebeController.java:113)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
... 26 more
Alguma ideia? Tem algum outro modo de fazer isso?
Colocou os filtros no web.xml?
Amauri, meu problema não está no upload em si, o meu problema está em fazer upload para um servidor HTTP. Eu testei fazendo upload pra minha máquina local e está funcionando, portanto não creio que o tópico que você sugeriu tenha alguma coisa a ver com o meu problema.
Os filtros que utilizo no web.xml:
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
Confirma se eu entendi direito, você quer fazer o upload de uma imagem no seu sistema e colocar num servidor diferente, como um apache por exemplo para que o conteúdo estático, não fique no seu sistema, é isso?
Se for isso o servidor estático deve estar preparado para isso, ai já teria que fazer algo em PHP por exemplo para receber a imagem.
Se não for isso por favor explique melhor.
Sendo bem sincero, talvez o que eu pretendo fazer seja impossível… mas tentarei explicar melhor:
Na empresa onde trabalho temos os fontes do site que está hospedado aqui no nosso servidor. Porém os fontes do sistema gerenciador do site não está aqui conosco, está hospedado num servidor de fora.
O sistema gerenciador do site está com problema na parte onde faz upload de imagens para serem exibidas no site. Essas imagens ficam no servidor onde está o sistema gerenciador, ou seja, não fica no servidor aqui da empresa.
O site pega as imagens que são cadastradas pelo sistema gerenciador a partir de uma determinada URL, por exemplo: http://www.exemplo.com/application/modules/static/img/
Pergunto novamente: tem como fazer uma aplicação que faça upload via HTTP, como por exemplo fazer upload neste diretório: http://www.exemplo.com/application/modules/static/img/
Daria sim, se você pudesse mexer nos dois sistemas mas se não pode é melhor pensar em algo como ftp caso o servidor onde esta o sistema gerenciador possua, se não fica ainda mais difícil.
E pelo que você disse a parte de upload do sistema gerenciador está ruim, então nem vale a pena quebrar a cabeça, para fazer algo via http.
Sim, ele tem FTP, porém não temos acesso.
Estou querendo criar uma aplicação separada justamente porque o gerenciador está com problemas. Como eu não tenho os fontes do sistema, então não tenho como corrigir.
O X da questão é que eu teria que jogar as fotos naquele diretório http pois é por lá que o site busca elas.
Só pra deixar mais claro pra mim e para futuros visitantes do tópico: o que teria que ser feito então para poder fazer upload num diretório como esse: http://www.exemplo.com/application/modules/static/img/ ?
O site controlador deveria ter um processo de upload, se fosse Spring por exemplo deveria ter um método com uma assinatura assim:
E uma configuração assim no aplicationContext.xml do Spring
[code]<bean id="multipartResolver"
class=“org.springframework.web.multipart.commons.CommonsMultipartResolver”>
<!-- one of the properties available; the maximum file size in bytes -->
<property name="maxUploadSize" value="5242880"/>
</bean>[/code]
Bem como a biblioteca “commons-fileupload”.
Se fosse PHP não sei como faria mas uma rápida busca traria a forma de fazer.
Espero ter ajudado.
Ok. Obrigado pelas respostas.