当前位置: 首页 > 面试题库 >

将Ajax中的文件上传到CherryPy

章晗日
2023-03-14
问题内容

我试图一次将许多文件上传到我的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
这就是我要上传的文件的长度,因此我假设整个文件已发送到服务器。

如何获取文件的内容?


问题答案:

至少看起来像下面这样。在Firefox和Chromium中进行了测试。如果您需要支持旧版浏览器,我会看一些JavaScript库来实现polyfills和fallback。

#!/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)


 类似资料:
  • 问题内容: 我可以使用以下jQuery代码使用ajax请求的POST方法执行文件上传吗? 如果可能,我是否需要填写部分?这是正确的方法吗?我只将文件发布到服务器端。 我一直在搜索,但是我发现是一个插件,而在我的计划中我不想使用它。至少目前是这样。 问题答案: 上传文件是 不是 有可能通过AJAX。 您可以使用来上传文件,而无需刷新页面。 更新 使用XHR2,支持通过AJAX上传文件。例如通过对象,

  • 问题内容: 我在stackoverflow和普通的Internet上都看过,找不到一个简单的AJAX文件上传器(仅表单提交)。我发现的那些不够灵活,不符合我的目的。如果我可以将此脚本用于文件上传,那就太好了: 在HTML中,我将拥有 谢谢 问题答案: 这是一个简单的ajax文件上传器 上载 如果您不想使用闪光灯,则可以使用此闪光灯。 AxUploader

  • 问题内容: 因此,我尝试上传没有任何外部插件的文件,但是遇到了一些错误。 我的服务器: 我收到请求的文件。 现在如何正确获取带有我的代码的上传文件? 问题答案: 我遵循了本教程http://www.script-tutorials.com/pure-html5-file- upload/ ,在php部分中,我替换为: 也改变了这行

  • 问题内容: 我认为有一个文件 和一个ajax请求 但是 Request.Files中 没有文件。Ajax请求出了什么问题? 问题答案: 在ASP.Net MVC中使用AJAX上传文件 自HTML5以来情况发生了变化 的JavaScript 控制者 编辑 :HTML

  • 我正在尝试将文件上传到s3存储桶中的文件夹中。我正在用PHP做以下工作: 桶名是发送到PHP的字符串,表示使用正斜杠的子文件夹: 然而,当我将一个新图像上传到我的bucket时,它会被上传到bucket root。如何将此文件上载到bucket中的子文件夹? 谢谢

  • 问题内容: 我正在创建用于发送邮件的邮件页面。我需要在发送前附加一些文件。我如何使用AJAX做到这一点?最初,我需要将这些文件存储在服务器中,然后必须发送邮件。通过单个发送按钮即可完成这些操作。 问题答案: 检查以下问题: JavaScript文件上传 如何为我的Web应用程序上传类似Gmail的文件? 什么是最好的多文件JavaScript / Flash文件上传器?