python - 将 ajax 中的文件上传到 CherryPy

标签 python ajax upload cherrypy

我正在尝试一次将多个文件上传到我的 CherryPy 服务器。

我正在关注this tutorial显示服务器端的 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 这是我尝试上传的文件的长度,因此我假设整个文件已发送到服务器。

如何获取文件的内容?

最佳答案

它至少看起来像下面这样。在 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)

关于python - 将 ajax 中的文件上传到 CherryPy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26876695/

相关文章:

python - 动态比较常见事件的列表

php - JQuery验证插件: Use remote with delay

jquery - 如何在 JQuery 中显示加载图像?

java - 以编程方式通过 android 上的 imgur 上传照片

python - 为什么将 DatetimeIndex 转换为 np.array 时格式会发生变化?

python - 如何使用python获取字符串中的信息片段

javascript - ScrollTop 无法更新到 jQuery 1.11.1

c# - 如何将文件从 VS 2008 C# 桌面应用程序上传到 Windows 服务器 2008/IIS 7

python - GAE Python 如何检查上传的文件类型

python - python 中具有相同成员和 super 的类的菱形继承(钻石问题)