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
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:
nun sind wir im DAO:
Konstruktor von CSVWriter (diese Klasse schreibt die Daten in den Stream)
Wir schreiben das ganze in den Stream:
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
Ich habe schon die diversen Themen zu Zip durchgearbeitet und nun meine Frage: Wo ist der Fehler
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