Загрузка файла в ajax на CherryPy

Я пытаюсь загрузить сразу несколько файлов на сервер CherryPy.

Я следую этому руководству, которое показывает PHP-код на стороне сервера.

Часть JavaScript проста. Вот краткое изложение того, что он делает:

function FileSelectHandler(e) { var files = e.target.files || e.dataTransfer.files; for (var i = 0, f; f = files[i]; i++) { var xhr = new XMLHttpRequest(); xhr.open("POST", "upload", true); xhr.setRequestHeader("X_FILENAME", file.name); xhr.send(file); } 

Я перевел upload.php описанный в учебнике, примерно так:

 def upload(self): [...] 

Когда сервер получает запрос, я вижу, что cherrypy.request.headers['Content-Length'] == 5676 который является длиной файла, который я пытаюсь загрузить, поэтому я предполагаю, что весь файл был отправлен на сервер.

Как получить содержимое файла?

  • Python PIL: Как нарисовать эллипс в середине изображения?
  • Плохая работа Django / uwsgi
  • Как просмотреть (log) ход передачи файла с помощью paramiko?
  • Получите декартовое произведение из серии списков?
  • Устанавливать различия в столбцах между кадрами данных
  • Python / SWIG: вывод массива
  • Преобразовать список в кортеж в Python
  • Почему моя анимация pylab замедляется при каждом обновлении?
  • One Solution collect form web for “Загрузка файла в ajax на CherryPy”

    По крайней мере, он выглядит следующим образом. Протестировано в Firefox и Chromium. Если вам нужно поддерживать устаревшие браузеры, я бы посмотрел на библиотеку JavaScript для полиполнений и резервного копирования.

     #!/usr/bin/env python # -*- coding: utf-8 -*- import os import shutil import cherrypy config = { 'global' : { 'server.socket_host' : '127.0.0.1', 'server.socket_port' : 8080, 'server.thread_pool' : 8, } } class App: @cherrypy.expose def index(self): return '''<!DOCTYPE html> <html> <head> <title>CherryPy Async Upload</title> </head> <body> <form id='upload' action=''> <label for='fileselect'>Files to upload:</label> <input type='file' id='fileselect' multiple='multiple' /> </form> <script type='text/javascript'> function upload(file) { var xhr = new XMLHttpRequest(); xhr.upload.addEventListener('progress', function(event) { console.log('progess', file.name, event.loaded, event.total); }); xhr.addEventListener('readystatechange', function(event) { console.log( 'ready state', file.name, xhr.readyState, xhr.readyState == 4 && xhr.status ); }); xhr.open('POST', '/upload', true); xhr.setRequestHeader('X-Filename', file.name); console.log('sending', file.name, file); xhr.send(file); } var select = document.getElementById('fileselect'); var form = document.getElementById('upload') select.addEventListener('change', function(event) { for(var i = 0; i < event.target.files.length; i += 1) { upload(event.target.files[i]); } form.reset(); }); </script> </body> </html> ''' @cherrypy.expose def upload(self): '''Handle non-multipart upload''' filename = os.path.basename(cherrypy.request.headers['x-filename']) destination = os.path.join('/home/user', filename) with open(destination, 'wb') as f: shutil.copyfileobj(cherrypy.request.body, f) if __name__ == '__main__': cherrypy.quickstart(App(), '/', config) 
    Interesting Posts
    Python - лучший язык программирования в мире.