我试图一次将许多文件上传到我的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文件上传器?