Zip über Streams und DAO's

thoser

Mitglied
Zuerst muß ich sagen, das das meine ersten Versuche mit ZIP über Stream und DAO's sind.
Es geht um folgendes: Der Client sendet eine Anforderung an den Server eine bestimmte Anzahl Daten aus der DB2 zu lesen und sie zurückzuschicken, was auch funktionierte. Nun wird aber verlangt das als Zip zu machen. (Keine Möglichkeit eine Zip-Datei zu erstellen und diese dann downzuladen).

Nun nochmal mit dem Code, den ich schon habe:

Clientanforderung
Java:
import org.apache.commons.httpclient.*;
.
.
.

   private File export( String file, String file2 ) throws IOException {
        System.setProperty( "proxySet", "true" );
        System.setProperty( "proxyHost", "localhost" );
        System.setProperty( "proxyPort", "9081" );


        int status = 0;
        LOG.info( "export request:" + file );
        dialog.setFileName( file2 );
        
        dialog.setStatus( "Sende Anfrage,..." );
        HttpClient client = new HttpClient();
        client.getParams().setAuthenticationPreemptive( true );
        UserInterface userInterface = UserInterface.getInstance();
        client.getState().setCredentials( AuthScope.ANY, userInterface.getCredentials() );
        GetMethod get = new GetMethod( userInterface.getDestinationURI() + "/export/" + file );
        get.setDoAuthentication( true );
        OutputStream out = null;
        File tmpFile = null;
        
        
        boolean success = false;
        try {
            status = client.executeMethod( get );
            if ( status == 200 ) {
                dialog.setStatus( "Empfange Daten,..." );
                tmpFile = ui.createTempFile( "export" );                
                InputStream is = get.getResponseBodyAsStream();                
                ZipInputStream in = new ZipInputStream(is);
                ZipEntry entry = in.getNextEntry();
tmpFile = new File ("c:/Temp" + entry.getName());                
                out = new FileOutputStream( tmpFile );
                copyStreams( out, in );
                in.close();
                out.flush();
                out.close();
                dialog.setStatus( "Datei geladen." );
                if ( !cancel ) {
                    success = true;
                    return tmpFile;
                }
                return null;
            }
            dialog.setFileName( "http status failure:" + status );
            String message = "Unerwarteter Status beim Export der Datei: " + file2 + " [" + status + "]";
            LOG.error( message );
            throw new IOException( message );
        } catch ( HttpException e ) {
            e.printStackTrace();
            throw new IOException( e.getMessage() );
        } finally {
            close( out );
            if ( !success ) {
                if ( tmpFile != null ) {
                    tmpFile.delete();
                }
            }
            get.releaseConnection();
        }
    }

Die Datei will ich zwischenspeichern, für den Fall das die Übertragung abbricht. So habe ich immer die alte Version.


Nun zum Server: Die Anforderung übernimmt ein Servlet:

Java:
   protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
        // name des dokuments aus dem Pfad
        String documentName = request.getPathInfo();
        
    // Rückgabe ist ein zip
    response.setContentType("application/zip");    
        
        // APM
        if ( "/zinsentwicklung.csv".equals( documentName ) ) {
            exportZinsentwicklung( request, response, documentName );
}

   protected void exportZinsentwicklung( HttpServletRequest request, HttpServletResponse response, String documentName ) throws ServletException {
        Connection con = DBUtil.getConnection();
        try {
            ApmDAO.getInstance().exportZinsentwicklung( new ZipOutputStream (response.getOutputStream()), con, documentName );
        } catch ( Exception e ) {
            throw new ServletException( e.getMessage() );
        } finally {
            DBUtil.close( con );
        }
    }

nun sind wir im DAO:

Java:
    public void exportZinsentwicklung( OutputStream os, Connection con, String documentName ) {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            stmt = prepare( con, SQL_EXPORT_ZINSENTWICKLUNG );
            rs = stmt.executeQuery();
            CSVWriter writer = new CSVWriter( (ZipOutputStream) os, documentName );
            writer.write(rs);
            writer.flush();
        } catch ( SQLException e ) {
            LOG.error( "sql error:" + e.getMessage() );
            throw new VbrmException( e.getMessage(), VbrmClient.RC_UNEXPECTED );
        } finally {
            close( rs );
            close( stmt );
        }
    }


Konstruktor von CSVWriter (diese Klasse schreibt die Daten in den Stream)

Java:
    public CSVWriter( ZipOutputStream out, String documentName ){
os = out;        
os.setMethod(ZipOutputStream.DEFLATED);
entry = new ZipEntry(documentName);
try
{
    os.putNextEntry(entry);
}
catch (IOException e)
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}
        writer = new PrintWriter( os );
        eol=false;
    }


Wir schreiben das ganze in den Stream:

Java:
    public int write( ResultSet rs ){
        try{
            int columns = rs.getMetaData().getColumnCount();
            int rows = 0;

            // um die erste Zeile mit reinzukriegen
//            add(rs, columns);
//            rows++;
            while( rs.next() ){
                add( rs, columns );
                rows ++;
            }
            try
            {
                os.closeEntry();
            }
            catch (IOException e)
            {
                LOG.error("IOException129 aufgetreten: " + e.getLocalizedMessage());
            }             
            return rows;
        }catch( SQLException e ){
            throw new VbrmException( e.getMessage(), VbrmClient.RC_UNEXPECTED );
        }
    }

Die Methode "add" ist überladen. Die hier aufgerufene Version nimmt jedes Object aus dem ResultSet und füttert damit die untere Fassung. "filter" sorgt lediglich dafür, das kritische Zeichen wie \ und ' ersetzt werden

Java:
    public void add( Object value ){
        if( value != null ){
	        writer.print( filter( value.toString() ).getBytes() );
        }
        writer.print( TRENNER.getBytes() );
    }

Ich habe schon die diversen Themen zu Zip durchgearbeitet und nun meine Frage: Wo ist der Fehler
 
Ach verdammt ;)
Mein Problem ist das ich sowas erhalte:

Code:
[B@5430543[B@5920592[B@6060606[B@6880688[B@6d506d5[B@7220722[B@7890789[B@7d607d6[B@8230823[B@8700870[B@8bd08bd[B@90a090a[B@98e098e[B@9dc09dc[B@a700a70[B@abd0abd[B@b0a0b0a[B@b570b57[B@ba40ba4[B@bff0bff[B@c4c0c4c[B@c990c99[B@d300d30[B@da80da8[B@df60df6[B@e6e0e6e[B@ecc0ecc[B@f530f53[B@fa00fa0[B@10181018[B@10661066[B@10de10de[B@112c112c[B@11791179[B@1c541c54[B@1ca11ca1[B@1d151d15[B@1d621d62[B@1daf1daf[B@1e271e27[B@1e751e75[B@1ec21ec2[B@1f0f1f0f[B@1f5c1f5c[B@1fa91fa9[B@1ff61ff6[B@20592059[B@20cd20cd[B@211a211a[B@21672167[B@21b421b4[B@222c222c[B@227a227a[B@22c722c7[B@23142314[B@23612361[B@23ae23ae[B@23fb23fb[B@246f246f[B@24bc24bc[B@25092509[B@25562556[B@25a925a9[B@25f625f6[B@2ede2ede[B@2f2b2f2b[B@2f782f78[B@2fc52fc5[B@30393039[B@30863086[B@30d330d3[B@31203120[B@316d316d[B@31ba31ba[B@32073207[B@32543254[B@32a132a1[B@32ee32ee[B@333b333b[B@33b333b3[B@34013401[B@344e344e[B@34a234a2[B@34ef34ef[B@353c353c[B@35893589[B@35d635d6[B@36d136d1[B@371e371e[B@376b376b[B@37b837b8[B@38193819[B@38663866[B@38b338b3[B@39003900[B@394d394d[B@39ae39ae[B@39fb39fb[B@3ae53ae5[B@3b323b32[B@3c4d3c4d[B@3c9a3c9a[B@3d0e3d0e[B@3d5b3d5b[B@3da83da8[B@3e1c3e1c[B@3e693e69[B@3ee03ee0[B@4f3f4f3f[B@4f8c4f8c[B@4fd94fd9[B@50655065[B@50b250b2[B@51365136[B@51835183[B@51d051d0[B@52445244[B@52915291[B@53055305[B@53525352[B@53c653c6[B@54135413[B@54875487[B@54d454d4[B@55485548[B@55955595[B@560d560d[B@565b565b[B@56cf56cf[B@571c571c[B@57905790[B@57dd57dd[B@58515851[B@589e589e[B@59125912[B@595f595f[B@59d359d3[B@5a205a20[B@5a975a97[B@5ae55ae5[B@5b325b32[B@5b7f5b7f[B@5bf35bf3[B@5c405c40[B@5c8d5c8d[B@5cda5cda

Ich habe es schon probiert, der Name von ZipEntry wird korrekt ausgelesen, daher nehme ich an, das ich die Bytes nicht auslesen kann. Nur, stimmt das und wie kann ich den Fehler beheben?
Im Moment geht es mir nur darum, die Zip-Datei korrekt auszulesen und in eine Datei schreiben zu können. Diese korrekt zu benennen kommt später.
 
Mein Chef will jetzt doch nicht mehr die Daten als Zip streamen. Aber wenn jemand eine Lösung findet, wäre es schön sie hier zu posten. Denn evtl. hat ja jemand ein ähnliches Problem.
 

Neue Beiträge

Zurück