2016-08-24 17 views
8

Podczas konfigurowania serwera kolby możemy próbować odbierać przesłany przez użytkownika plikJak otrzymać dodany plik z Klein jak kolby pytona

imagefile = flask.request.files['imagefile'] 
filename_ = str(datetime.datetime.now()).replace(' ', '_') + \ 
    werkzeug.secure_filename(imagefile.filename) 
filename = os.path.join(UPLOAD_FOLDER, filename_) 
imagefile.save(filename) 
logging.info('Saving to %s.', filename) 
image = exifutil.open_oriented_im(filename) 

Kiedy patrzę na dokumentacji Klein, mam Widać http://klein.readthedocs.io/en/latest/examples/staticfiles.html, jednak wydaje się, że dostarczenie pliku z usługi internetowej zamiast odbierania pliku, który został przesłany do usługi internetowej. Jeśli chcę, aby mój serwer Klein mógł odbierać abc.jpg i zapisywać go w systemie plików, czy istnieje jakaś dokumentacja, która poprowadzi mnie do tego celu?

+1

Powinieneś być w stanie wyodrębnić plik w żądaniu HTTP (zwykle POST), tak jak każdą inną zmienną. Wygląda na to, że Klein jest oparty na pokręconym, więc może [to rozwiązanie dla osób] (http://www.cristinagreen.com/uploading-files-using-twisted-web.html) będzie działać dla ciebie. –

+0

Dziękuję, przyjrzę się. – JLTChiu

Odpowiedz

2

Zgodnie z komentarzem Liam Kelly, fragmenty z this post powinny działać. Korzystanie z cgi.FieldStorage umożliwia łatwe wysyłanie metadanych plików bez wysyłania ich bezpośrednio. Klein/Twisted podejście będzie wyglądać mniej więcej tak:

from cgi import FieldStorage 
from klein import Klein 
from werkzeug import secure_filename 

app = Klein() 

@app.route('/') 
def formpage(request): 
    return ''' 
    <form action="/images" enctype="multipart/form-data" method="post"> 
    <p> 
     Please specify a file, or a set of files:<br> 
     <input type="file" name="datafile" size="40"> 
    </p> 
    <div> 
     <input type="submit" value="Send"> 
    </div> 
    </form> 
    ''' 

@app.route('/images', methods=['POST']) 
def processImages(request): 
    method = request.method.decode('utf-8').upper() 
    content_type = request.getHeader('content-type') 

    img = FieldStorage(
     fp = request.content, 
     headers = request.getAllHeaders(), 
     environ = {'REQUEST_METHOD': method, 'CONTENT_TYPE': content_type}) 
    name = secure_filename(img[b'datafile'].filename) 

    with open(name, 'wb') as fileOutput: 
     # fileOutput.write(img['datafile'].value) 
     fileOutput.write(request.args[b'datafile'][0]) 

app.run('localhost', 8000) 

z jakiegokolwiek powodu, mój Python 3.4 (Ubuntu 14.04) wersja cgi.FieldStorage nie zwraca poprawne wyniki. Testowałem to na Pythonie 2.7.11 i działa dobrze. Mając to na uwadze, można również pobrać nazwę pliku i inne metadane na interfejsie i wysłać je w wezwaniu ajax do kleina. W ten sposób nie będziesz musiał wykonywać zbyt wielu operacji na zapleczu (co zwykle jest dobre). Alternatywnie możesz dowiedzieć się, jak korzystać z narzędzi dostarczonych przez werkzeug. Funkcje werkzeug.secure_filename i request.files (tj. FileStorage) nie są szczególnie trudne do wdrożenia lub odtworzenia.