Profilo di beppenapo

Nome beppenapo
Indirizzo email n/a
Messaggi1
  • pgsql2shp + zip + cgi + download ... bad header
    Forum >> Programmazione Python >> Web e Reti
    Un saluto a tutta la comunità,
    questo è il mio primo post, spero di non fare troppi errori da novellino ;)

    Dunque, sto sviluppando un'applicazione web (apache+php+jquery+tomcat+geoserver+postgres+postgis, il tutto gira su server debian), per alcune funzioni ho utilizzato python (finalmente ho avuto la possibilità di studiarmelo!), ma una in particolare mi sta dando un po' di problemi:

    da una mappa con punti, linee e poligoni georeferenziati (gestiti da postgres/postgis e pubblicati con openlayers via geoserver), l'utente fa una ricerca e scarica i dati in diversi formati (shp, json, gml, csv).

    Avrei potuto mandare una richiesta direttamente a geoserver ma volevo evitare di inserire un pulsante di download per ogni tipo di formato (considerate che per lo shape ho 3 diverse richieste poiché punti, linee e poligoni sono gestiti da tabelle diverse), da qui l'idea di utilizzare python per creare i vari file, zipparli e far partire il download cliccando su un solo pulsante.

    Ho creato le varie funzioni, e salvato il file nella cartella cgi-bin (apache, ovviamente, è stato configurato per la gestione dei file python da cgi-bin).

    Lo script crea i vari file, crea l'archivio zip e pulisce la cartella dai file creati lasciando solo lo zip...il problema arriva al download: nell'error.log di apache leggo "malformed header from script 'test.py': Bad header: Initializing..."

    L'errore sparisce e il download va a buon fine se dallo script elimino le funzioni per la creazione degli shapefile!!!

    Per creare gli shp utilizzo pgsql2shp e credo il problema stia nel fatto che il comando pgsql2shp produce output:

    Initializing... 
    
    Done (postgis major version: 2).
    
    Output shape: MultiPoint
    
    Dumping: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [5732 rows].
    
    Initializing... 
    
    Done (postgis major version: 2).
    
    Output shape: PolyLine
    
    Dumping: XX [187 rows].
    
    Initializing... 
    
    Done (postgis major version: 2).
    
    Output shape: Polygon
    
    Dumping: XXXXXXXXXXX [1057 rows].
    
    La funzione completa (tralascio le cose superflue a favore di una maggiore leggibilità) per creare gli shape è:

    punti = 'pgsql2shp -f %s%s_punti.shp -h %s -p 5432 -u %s -P %s %s "SELECT ....;"'%(path,f,host,username,password,db)
    linee = 'pgsql2shp -f %s%s_linee.shp -h %s -p 5432 -u %s -P %s %s "SELECT ...;"'%(path,f,host,username,password,db)
    poligoni = 'pgsql2shp -f %s%s_poligoni.shp -h %s -p 5432 -u %s -P %s %s "SELECT ..."'%(path,f,host,username,password,db)def shp():
    try:
      os.system(punti)
    except:
      return
    try:
      os.system(linee)
    except:
      return
    try:
      os.system(poligoni)
    except:
      return
    mentre per lo zipfile e il download:

    HEADERS = '\r\n'.join(["Content-type: %s;", "Content-Disposition: attachment; filename=%s","Content-Title: %s","\r\n"])
    def zipFunc(cartella,nome):
            escludi = ['*.zip']
            for dirname, subdirs, files in os.walk(cartella):
                for filename in files:
                    if not filename.endswith('zip'):
                        nome.write(os.path.join(dirname, filename), filename)
                        os.remove(os.path.join(dirname, filename))
    out = StringIO()
    zip = zipfile.ZipFile(out, "w", zipfile.ZIP_DEFLATED)
    zipFunc(path,zip)
    zip.close()
    out.seek(0)
    sys.stdout.write(HEADERS % ('application/zip', url,f))
    sys.stdout.write(out.read())
    out.close()
    Secondo voi è corretto pensare che il problema sia l'output prodotto da pgsql2shp, se si come eliminare l'errore? Nella documentazione non c'è nessuna opzione che permetta di non stampare output.

    Magari esiste un'altra strada per ottenere lo stesso risultato?

    Grazie a tutti

    -beppe-