gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:58:14 26 4
gpt4 key购买 nike

我正在尝试一次将多个文件上传到我的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com