Forum
>>
Programmazione Python
>>
Web e Reti
>>
pgsql2shp + zip + cgi + download ... bad header
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
Scritto da beppenapo |
2016-04-02 00:17:08 - pgsql2shp + zip + cgi + download ... bad header
|
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: returnmentre 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- |
Pagina: 1
Esegui il login per scrivere una risposta.