Как отправить компресс (zip-файл) используя бутылку и wsgi - PullRequest
0 голосов
/ 09 января 2019

Я хотел отправить сжатый файл с сервера клиенту, используя WebSocket. Код на стороне сервера:

@app.route('/websocket')
def handle_websocket():
    print("getting here")
    wsock = request.environ.get('wsgi.websocket')
    if not wsock:
        abort(400, 'Expected WebSocket request.')

    while True:
        try:
            # passing the information as a dictionary
            message = wsock.receive()
            data = json.loads(message)

            container = data[0]

            imag1 ='./download/png_files'
            newaddress_asc ='./download/asc_files'
            newaddress_tif ='./download/tif_files'

            # message is dictionary
            projCod = container["param1"]# EPSG code: 4326
            pntNumb = container["param2"]# point number


            dictionary=Com_pro.Dcomputing(projCod,pntNumb)

            writefile.loadresulttoaddress(dictionary,'png',imag1)


            zipfilename='D_result.zip'
            open_path ='./download/'
            save_path = open_path
            writefile.compress_save_file(zipfilename,open_path,save_path)
            filename='DSM_result.zip'
            static_file(filename, root='./download', download=filename)



            wsock.send(filename)
        except WebSocketError:
            break

from gevent.pywsgi import WSGIServer
from geventwebsocket import WebSocketError
from geventwebsocket.handler import WebSocketHandler
server = WSGIServer(("0.0.0.0", 8081), app,
                    handler_class=WebSocketHandler)
server.serve_forever()

Клиентская сторона кода:

function test(){
  var ws = new WebSocket("ws://example.com:8080/websocket");
  var clusternumber = 4;
  var vertex = {row: 11,
                value: "(-122.31088757514952,38.351500957145674)_(-122.30862379074097,38.352796664075726)_(-122.30824828147888,38.35236756889378)_(-122.30908513069151,38.35192164375559)_(-122.30877399444577,38.35158509466319)_(-122.30821609497069,38.351904816338134)_(-122.30743288993834,38.351055026670906)_(-122.30881690979002,38.35028095215651)_(-122.3073363304138,38.34822793185049)_(-122.30818390846251,38.34784088051842)_(-122.30822682380675,38.347849294699785)_"};
     // var vertex.value = [-122.19276309013367,38.13030324622909]
  var terrainatrribute = "Height,Curvature,Slope,Wetness,Position,";

  var soilfunction = "ClassMap,";   

  var data = [];
  ws.onopen = function() {
    data.push( {"param1": 'EPSG:4326', "param2": vertex.row,
           "param3":vertex.value, "param4":clusternumber,
           "param5":soilfunction, "param6":terrainatrribute,});

    console.log(JSON.stringify(data))
    ws.send(JSON.stringify(data));
  };

  ws.onmessage = function (evt) {
      console.log("This is is what is being returned from the server");
      alert(evt.data);
  };
  ws.onerror = function( evt ){
    alert(evt.data);
  }
}

Для строкового типа данных код работает отлично. Однако, когда я пытаюсь отправить сжатый файл, он не работает. Я получаю тип данных возврата

[объект Blob]

Я прочитал в Интернете на документацию по бутылке , что «Все, что имеет метод .read (), обрабатывается как файл или подобный файлу объект и передается в вызываемый элемент wsgi.file_wrapper, определенный сервером WSGI. фреймворк. Некоторые реализации сервера WSGI могут использовать оптимизированные системные вызовы (sendfile) для более эффективной передачи файлов. В других случаях это просто повторяет над кусками, которые вписываются в память. Необязательные заголовки, такие как Content-Length или Content-Type, не являются установить автоматически. Используйте send_file(), если это возможно. Я немного озадачен тем, как использовать эти функции. И если я должен реализовать свой собственный обработчик, у вас есть какие-либо предложения. Я очень ценю вашу помощь, спасибо.

...