Fazer upload de um Obj Image

E ai galera, blz?

Estou com um pequeno problema e derrepente alguem por ai possa meajudar.

Fiz a copia de uma imagem da área de tranferencia para dentro de um JLabel, essa parte está funcionando bem.

try { Clipboard cpb = Toolkit.getDefaultToolkit().getSystemClipboard(); Transferable contents = cpb.getContents(this); Icon icon = new ImageIcon((Image) contents.getTransferData( DataFlavor.imageFlavor )); lblImage.setIcon(icon); // seta a imagem no JLabel }

Ai que está o meu problema, tenho um servlet onde implementei um File Upload, e preciso enviar esta imagem para o servlet.
Para isso vou usar o HttpClient da jakarta, porém para enviar esta imagem no POST preciso que seja um arquivo(File) e como estou usando webstart não tenho como gravar esse arquivo no disco do client (eu acho), desta forma preciso criar uma especie de Virtual File desse Obj Image que está no JLabel.

Resumindo: Tenho que pegar a imagem q está no Icon e enviar no POST sem gravar o arquivo no disco…

Se alguém por ai tiver uma luz vai me ajudar pra caramba…
Com alguns exemplos que eu achei tentei fazer alguma coisa mais ou menos assim:

Image img = ((ImageIcon)lblImage.getIcon()).getImage(); BufferedImage bi = (BufferedImage) img; File f = new File("Image.jpg");

Qualquer ajuda é bem vinda.
Um grande abraço para todos do forum…

Vc pode fazer um WebService para receber a imagem. Desta forma, seu cliente simplismtente teria q recuperar a danada do clipboard e mandar pro webservice, sem precisar fazer um post…

Para serializar a icon, vc pode utilizar o XStream q eh um projetinho opensource bem legal!

E ai galera blz,

Consegui fazer mais ou menos o que eu queria…
como na máquina do cliente eu não tenho permisão estou enviando o objeto Icon do JLabel.

No lado do server eu tenho dois tratamentos de upload, um para Objeto e outro para arquivo.
Isso eu identifico quando na URL, creio q deva ter alguma forma automática de fazer essa identificação, mas eu já pesquisei demais de ontem pra hoje, e resolvi apelar mesmo, segue abaixo o código caso alguém precise:

Parametro tipo=ST : Webstart (estou recebendo um objeto)
Parametro tipo=WB : Web (Estou recebendo um arquivo)

Lado do cliente - Html
Aqui é só uma página o único detalhe é o tipo do formulário e do campo

[code]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Send File - Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
</head>

<body>
<form name="form1" method="post"
action="…/hdesk.sendFile?tipo=WB"
enctype="multipart/form-data">
<input name="filename" type="file">
<input type="submit" name="btnEnviar" value="Enviar">
</form>
</body>
</html>[/code]

Lado do cliente - Webstart
Método que envia o arquivo, o resto é um JFrame convencional

[code]
public void UploadImage() {
try {
//Atribui a url do servlet para fazer o upload
String path = "http://localhost:8080/myApp/hdesk.sendFile?tipo=WB";
URL url = new URL(path);
URLConnection conn = url.openConnection();

        //Prepara a conexão para Entrada e Saída
        conn.setDoInput&#40;true&#41;;
        conn.setDoOutput&#40;true&#41;;

        //Desabilita o Cache
        conn.setUseCaches&#40;false&#41;;

        //Atribui o content type
        conn.setRequestProperty&#40;&quot;Content-type&quot;, &quot;application/x-java-serialized-object&quot;&#41;;

        //Escreve o objeto como post
        ObjectOutputStream out = new ObjectOutputStream&#40;conn.getOutputStream&#40;&#41;&#41;;

         // Pega o Icon do JLabel
        out.writeObject&#40;lblImage.getIcon&#40;&#41;&#41;;
        out.flush&#40;&#41;;
        out.close&#40;&#41;;

        // Envia o arquivo
        InputStream ins = conn.getInputStream&#40;&#41;;
        ObjectInputStream objin = new ObjectInputStream&#40;ins&#41;;

        // Aguarda o retorno
        String msg = &#40;String&#41;objin.readObject&#40;&#41;;
        
        JOptionPane.showMessageDialog&#40;this, &quot;Arquivo gravado com sucesso.&quot;&#41;;
        System.exit&#40;0&#41;;
    &#125; catch &#40;Exception e&#41; &#123;
            e.PrintStackTrace&#40;&#41;;
    &#125;
&#125;[/code]

Lado do Server - Servlet Comum
No metodo doPost identifico qual o tipo do envio se é Obj ou não.
Arqui utilizei o commons-FileUpload da Jakarta para fazer o upload de arquivos
http://jakarta.apache.org/commons/fileupload/

[code]public class UploadTicketFile extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//Carrega o tipo do post
String tp = request.getParameter("tipo");

    //Verica o tipo do post&#58; 
    //tipo=ST &#58; Webstart &#40;estou recebendo um objeto&#41;
    //tipo=WB &#58; Web &#40;Estou recebendo um arquivo&#41;

    if &#40;tp != null &amp;&amp; tp.equals&#40;&quot;ST&quot;&#41;&#41; &#123;
        //tipo ST chama o método para upload de objeto
        uploadObj&#40;request, response&#41;;
    &#125;
    else &#123;
        PrintWriter out = null;
        try &#123;
		    response.setContentType&#40;&quot;text/plain&quot;&#41;;
		    out = response.getWriter&#40;&#41;;
            
            //Create a new file upload handler
            DiskFileUpload upload = new DiskFileUpload&#40;&#41;;
            //set the max uploaded file size &#40;-1 for no max size&#41;
            upload.setSizeMax&#40;-1&#41;;
            //Parse the request
            List items = upload.parseRequest&#40;request&#41;;
            
            int loopcnt = 0;
            //Process the uploaded items
            Iterator iter = items.iterator&#40;&#41;;
            
            while &#40;iter.hasNext&#40;&#41;&#41; &#123;
                loopcnt++;
                FileItem item = &#40;FileItem&#41; iter.next&#40;&#41;;
                
                if &#40;item.isFormField&#40;&#41;&#41; &#123; // the item is not a file item
                    String fieldname = item.getFieldName&#40;&#41;;
                    String value = item.getString&#40;&#41;;
                    
    				out.println&#40;
    	                    &quot;RESULT=OK\n&quot; +
    	                    &quot;MSG=Arquivo enviado com sucesso.\n&quot; +
    	                    &quot;ERROR=&quot;                    
    	            &#41;;
                &#125; else &#123; //the item is a file item
                    String fieldName = item.getFieldName&#40;&#41;;
                    String fileName = item.getName&#40;&#41;;
                    String contentType = item.getContentType&#40;&#41;;
                    
                    //copy the file to disk
                    File uploadedFile = new File&#40;fileName&#41;;
                    item.write&#40;uploadedFile&#41;;
                    
                &#125; //end of if - else
            &#125; //end of while
            
        &#125; catch &#40;Exception e&#41;&#123;
			out.println&#40;
                    &quot;RESULT=FAIL\n&quot; +
                    &quot;MSG=Ocorreu um erro fatal no envio do arquivo.\n&quot;+
                    &quot;ERROR=&quot;+e.getMessage&#40;&#41;                    
            &#41;;	
        &#125;
    &#125;

&#125;

//Upload do Objeto Imagem
private void uploadObj&#40;HttpServletRequest request, HttpServletResponse response&#41; 
		throws ServletException, IOException&#123;

    //Carrega o objeto enviado no request
    ObjectInputStream objin = new ObjectInputStream&#40;request.getInputStream&#40;&#41;&#41;;
    try &#123;
        // Converte o objeto para um image Icon
        ImageIcon icon = &#40;ImageIcon&#41;objin.readObject&#40;&#41;;
        Image img = icon.getImage&#40;&#41;;

        // Atribui o tipo da Imagem e 
        BufferedImage bi = new BufferedImage&#40;img.getWidth&#40;null&#41;, img.getHeight&#40;null&#41;, BufferedImage.TYPE_INT_RGB&#41;;
        Graphics2D g2 = bi.createGraphics&#40;&#41;;
        g2.drawImage&#40;img, null, null&#41;;
        FileOutputStream fout = null;
        //Change it to some server specific path
        
        String fileName = &quot;ticketImage.jpg&quot;;
        fout = new FileOutputStream&#40;fileName&#41;;
        
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder&#40;fout&#41;;
        JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam&#40;bi&#41;;
        param.setQuality&#40;0.5f, false&#41;;
        encoder.setJPEGEncodeParam&#40;param&#41;;
        try &#123;
            encoder.encode&#40;bi&#41;;
            fout.close&#40;&#41;;
            
            // Envia um objeto com informando o resultado da operação
            ObjectOutputStream out = new ObjectOutputStream&#40;response.getOutputStream&#40;&#41;&#41;;
            out.writeObject&#40;
                    &quot;RESULT=OK\n&quot; +
                    &quot;MSG=Arquivo enviado com sucesso.\n&quot; +
                    &quot;ERROR=&quot;      
            &#41;;
            
            out.flush&#40;&#41;;
            out.close&#40;&#41;;
        &#125;
        catch &#40;java.io.IOException io&#41; &#123;&#125;
    &#125; catch &#40;Exception e&#41; &#123;&#125;
&#125;


}[/code]

Ficou legal!

Parabens por ter conseguido e principalmente por compartilhar com a gente! :smiley:

[quote=“aborges”]Ficou legal!
Parabens por ter conseguido e principalmente por compartilhar com a gente! :D[/quote]

Achei sua idéia interessante, porém não conheço nada de Webservices, mas vou correr atraz, imagino que deve ficar mais simples.

Em relação a compartilhar, acho que é uma boa vc postar suas dúvidas resolvidas, pq as vezes alguém pode estar precisando desse resolver o mesmo problema e não posta aguardando uma resposta do seu.

Pra quem quser saber mais sobre Webstart,
http://java.sun.com/j2se/1.4.2/docs/guide/jws/developersguide/contents.html

Um abraço…

Para desenvolver Webservices existe um projetinho legal chamado Axis da jakarta!

Dah uma olhadinha:

http://ws.apache.org/axis/java/index.html