Struts upload

5 respostas
jgbt

galera,
preciso fazer um upload de uma aplicação swing p/ um servidor.
a principio vo abri uma conexão http e simular um post do arquivo com socket, foi definido assim, so vo executa.
implementei um teste simples de um jsp p/ uma action so p/ ver como funcionava, mas ta dando erro.

o jsp:

<%@ page contentType="text/html;charset=windows-1252"%>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
    <title>untitled</title>
  </head>
  <body>
    <form action='uploadAction.do' method="post" enctype="multipart/form-data">
        <input type='file' name='formFile'/>
        <input type="submit"/>
    </form>
  </body>
</html>

a action:

public class UploadAction extends Action
{
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
    {

        DynaValidatorForm dynaForm = (DynaValidatorForm) form;
        FormFile formFile = (FormFile) dynaForm.get("formFile");

        String fileName = formFile.getFileName();
        InputStream is = formFile.getInputStream();
        FileOutputStream fos = new FileOutputStream(new File("C:/teste/"+fileName));
        while(is.read() != -1) 
        {
            fos.write(is.read());
        }
        is.close();
        fos.close();

        return mapping.findForward(null);
    }


}

a exception:

org.apache.commons.fileupload.FileUploadException: Processing of multipart/form-data request failed. Read timed out
	at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:429)
	at org.apache.struts.upload.CommonsMultipartRequestHandler.handleRequest(CommonsMultipartRequestHandler.java:233)
	at org.apache.struts.util.RequestUtils.populate(RequestUtils.java:1209)
	at org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:821)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:254)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
	at com.evermind[Oracle Application Server Containers for J2EE 10g (10.1.2.0.0)].server.http.ResourceFilterChain.doFilter(ResourceFilterChain.java:65)
	at oracle.security.jazn.oc4j.JAZNFilter.doFilter(Unknown Source)
	at com.evermind[Oracle Application Server Containers for J2EE 10g (10.1.2.0.0)].server.http.EvermindFilterChain.doFilter(EvermindFilterChain.java:16)
	at oracle.adf.model.servlet.ADFBindingFilter.doFilter(ADFBindingFilter.java:239)
	at com.evermind[Oracle Application Server Containers for J2EE 10g (10.1.2.0.0)].server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:645)
	at com.evermind[Oracle Application Server Containers for J2EE 10g (10.1.2.0.0)].server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:322)
	at com.evermind[Oracle Application Server Containers for J2EE 10g (10.1.2.0.0)].server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:790)
	at com.evermind[Oracle Application Server Containers for J2EE 10g (10.1.2.0.0)].server.http.HttpRequestHandler.run(HttpRequestHandler.java:270)
	at com.evermind[Oracle Application Server Containers for J2EE 10g (10.1.2.0.0)].server.http.HttpRequestHandler.run(HttpRequestHandler.java:112)
	at com.evermind[Oracle Application Server Containers for J2EE 10g (10.1.2.0.0)].util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:192)
	at java.lang.Thread.run(Thread.java:534)

essa exception aparece ao submeter o form a primeira vez, se eu voltar e submeter de novo, não da erro, grava o arquivo mas fica corrompido.

ja tinha feito upload com servlets e tinha sido tranquilo.não sei o que ta acontecendo.

alguem ja passou por isso???

[]'s

5 Respostas

jgbt

bom o erro acontecia rodando dentro do jdev.
rodei por fora e não deu mais erro, mas gravava o arquivo corrompido.
troquei o o FileOutputStream por um DataOutputStream e gravou certo, não entendi o pq.

agora vo p/ segunda parte, upload a partir da app swing…

[]'s

L

Tem um exemplos legal aqui :
http://forum.exadel.com/viewtopic.php?t=120

L

hey! posso pegar o bonde andando?

tô a 1 semana com uma dor de cabeça por causa disso meus amigos!

quero fazer upload de imagens e gravar em um campo blob do oracle, para isso, após ler vários exemplos - até mesmo daqui - obtive uma biblioteca do JavaZoom, fiz vários testes, tudo gravou lindamente, peguei o add-ons para Servlet, e também funcionou…

porém o servlet grava em um filesystem, fiz uma customização para gravar no banco, bem isso já funcionava, simplesmente dá erro…

SQLException: fetch out sequence

cara, tá certinho… eu acho… me matei, ninguém aqui na sala fez um código semelhante ou precisou disso, pelo amor de Deus, me ajudem!

package br.com.webmusic.sample;

import br.com.webmusic.dao.ConnectionManager;
import java.io.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Hashtable;
import java.util.Properties;
import javazoom.upload.*;
import javazoom.upload.parsing.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Vector;

/**
* This servlet uses UploadBean to upload a file to a folder.
* Default folder is $WEBAPP_HOME/WEB-INF/
*/
public class UploadServlet extends HttpServlet
{
/**
* Processes upload to a folder.
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String error = null;
String idArt = null;
PrintWriter out = response.getWriter();
out.println("<html><head></head><body>");

try{
UploadBean upBean = new UploadBean();

if (MultipartFormDataRequest.isMultipartFormData(request)){
// Uses MultipartFormDataRequest to parse the HTTP request.
MultipartFormDataRequest mrequest = new MultipartFormDataRequest(request);
String todo = null;

if (mrequest != null) todo = mrequest.getParameter("todo");
if (mrequest != null) idArt = mrequest.getParameter("idArt");

if ( (todo != null) && (todo.equalsIgnoreCase("upload")) ){
Hashtable files = mrequest.getFiles();
if ( (files != null) && (!files.isEmpty()) ){
UploadFile file = (UploadFile) files.get("arquivo");
if (file != null) out.println("<li>Form field : uploadfile"+"<BR> Uploaded file : "+file.getFileName()+" ("+file.getFileSize()+" bytes)"+"<BR> Content Type : "+file.getContentType());
// Uses the bean now to store specified by jsp:setProperty at the top.
//upBean.store(mrequest, "arquivo");
insert(file,idArt);
out.println("<li>uploaded files");
}else{
out.println("<li>No uploaded files");
}
}
}
}catch( Exception e ){
e.printStackTrace();
}
out.println("</html>");
out.close();
//response.sendRedirect("OpenImage?idA=" + idArt);
}


private void insert(UploadFile file, String idArt ) throws UploadException{
String EMPTYBLOB = "empty_blob()";

// Insert an empty blob.
Connection c = ConnectionManager.getInstance();



String sql = "INSERT INTO artista_foto (id, id_art, nm_arquivo, bt_arquivo) VALUES (?,?,?,"+EMPTYBLOB+")";
PreparedStatement ps = null;
ResultSet r = null;

// obter o id da foto
String sqlId = "select artista_seq.nextval ida from dual";
Statement s = null;

try{
ps = c.prepareStatement(sql);

int idA = 0;
int id = Integer.parseInt( idArt );

s = c.createStatement();
r = s.executeQuery(sqlId);
if( r.next() )idA = r.getInt("ida");

r.close();

ps.setInt(1,idA);
ps.setInt(2,id);
ps.setString(3,file.getFileName());
int modified = ps.executeUpdate();

// Selects the lob for update.
String sql1 = "SELECT bt_arquivo FROM artista_foto WHERE id = ? FOR UPDATE";
PreparedStatement ps1 = c.prepareStatement(sql1);
ps1.setInt(1,idA);

ResultSet rs = ps1.executeQuery();
OutputStream os = null;
int lobsize = 0;

// Blob support.
oracle.sql.BLOB b = null;
while (rs.next()){
b = (oracle.sql.BLOB) rs.getBlob(1);
}// while end

os = b.getBinaryOutputStream();
lobsize = b.getBufferSize();

// Updates lob.
ByteArrayInputStream is = new ByteArrayInputStream( file.getData() );
byte[] buffer = new byte[lobsize];
int bytesRead = 0;

while( ( bytesRead = is.read( buffer ) ) != -1 ) os.write( buffer, 0, bytesRead );
os.close();
is.close();
c.commit();
}catch (SQLException e){
//throw new UploadException(e);
System.out.println( e.getMessage() );
e.printStackTrace();
}catch (IOException ie){
//throw new UploadException(ie);
ie.printStackTrace();
}finally{
ConnectionManager.closeConnection( c );
}
}// insert end

}
J

jgbt:
bom o erro acontecia rodando dentro do jdev.
rodei por fora e não deu mais erro, mas gravava o arquivo corrompido.
troquei o o FileOutputStream por um DataOutputStream e gravou certo, não entendi o pq.

agora vo p/ segunda parte, upload a partir da app swing…

[]'s

Cara vc está dizendo que o arquivo estava sendo gravado com erro qd usado o FileOutputStream certo.
Oque está acontecendo no seu código é o seu “while” que esta errado.

tente usar assim que funcionará assim granvando o arquivo certinho.

int i = 0;

while((i = is.read()) != -1){

fos.write(i);

}
E

como estou com uma dificuldade parecida, resolvi não criar outro tópico. estou com o seguinte erro:

javax.servlet.ServletException: Processing of multipart/form-data request failed. /temp/upload_00000008.tmp (No such file or directory)
	org.apache.struts.upload.CommonsMultipartRequestHandler.handleRequest(CommonsMultipartRequestHandler.java:202)
	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:443)
	org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:805)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
	com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
	org.securityfilter.filter.SecurityFilter.doFilter(SecurityFilter.java:188)
	org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)

root cause

org.apache.commons.fileupload.FileUploadException: Processing of multipart/form-data request failed. /temp/upload_00000008.tmp (No such file or directory)
	org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:429)
	org.apache.struts.upload.CommonsMultipartRequestHandler.handleRequest(CommonsMultipartRequestHandler.java:193)
	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:443)
	org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:805)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
	com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
	org.securityfilter.filter.SecurityFilter.doFilter(SecurityFilter.java:188)
	org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)

o servidor utilizado tem 3gb de RAM. o tomcat utiliza até 1gb e o java até 512. isso acontece qdo tentamos importar um arquivo de uns 7MB pro sistema…mas antes importavamos arquivos de até 11gb e não aconteciam problemas, de uma hora pra outra acontece esse erro…alguém pode me dar uma sugestão?

Criado 16 de março de 2005
Ultima resposta 11 de out. de 2007
Respostas 5
Participantes 5