如何使我的 HTTP 请求与表单的行为相同
How to make my HTTP request behave the same as a form
我的 HTTP 请求需要一些帮助。这是设置:
- 网页将图像加载到表单并将其发送到 python 服务器 运行 瓶子(使用表单或自定义 http 请求)
- Bottle 接收文件,将其作为 python 脚本的输入,接收结果并 return 到网页
在 bottle 的网站上有一个带有表格的示例:https://bottlepy.org/docs/dev/tutorial.html#file-uploads 我已经试过了并且有效。这是我使用的代码:
<html>
<head>
</head>
<body>
<form action="http://localhost:8080/solve" method="POST" enctype="multipart/form-data" norm="form" id='myForm'>
Select a file: <input type="file" name="upload"/>
<input type="submit" value="Start upload" />
</form>
</body>
</html>
瓶子里有:
@route('/solve', method='POST')
def solve():
file = request.files.get('upload')
name, ext = os.path.splitext(file.filename)
if ext not in ('.png','.jpg','.jpeg'):
return 'File extension not allowed.'
print(file.name)
resolved = sudoku.solve(file.file)
return str(resolved)
这个 "works",但是表单将我重定向到 localhost:8080,这不是我想要的。我尝试将目标放入隐藏的 iFrame,这会阻止重定向,但我无法访问 iFrame 主体中的结果...
我想要的是:发出类似于表单发出的 HTTP 请求。所以我尝试了:
<html>
<head> </head>
<body>
<form enctype="multipart/form-data" norm="form" id="myForm">
Select a file:
<input id="fileInput" type="file" name="upload" accept="image/png, image/jpeg, image/jpg" />
<input type="submit" value="Start upload" />
<label class="button-upload" onclick="send()">Upload</label>
</form>
</body>
<script>
var _file = null;
function send() {
var file = document.getElementById("fileInput").files[0]
console.log(file)
var url = "http://localhost:8080/solve";
var xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.setRequestHeader(
"Content-Type",
"multipart/form-data; boundary=---------------------------169461201884497922237853436"
);
var formData = new FormData();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
alert(xhr.responseText);
}
};
formData.append("upload", file);
xhr.send(formData);
}
</script>
</html>
我用网络开发工具查了一下,请求好像和表单发送的一样,但是bottle找不到文件。
file = request.files.get('upload')
returns None
和 file = request.files
returns <bottle.FormsDict object at 0x7ff437abf400>
所以有些东西,但我不明白如何访问它!
如有任何帮助,我们将不胜感激!
您的 JavaScript 代码看起来不错,除了您使用 xhr.setRequestHeader
设置请求 headers 的地方。 FormData
为您处理多部分编码,您无需手动设置请求 headers。我刚刚试过了,它似乎与 bottlepy 一起工作得很好。
总体而言,按如下方式更改 send()
函数:
function send() {
var file = document.getElementById("fileInput").files[0]
console.log(file)
var url = "http://localhost:8080/solve";
var xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
var formData = new FormData();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
alert(xhr.responseText);
}
};
formData.append("upload", file);
xhr.send(formData);
}
我的 HTTP 请求需要一些帮助。这是设置:
- 网页将图像加载到表单并将其发送到 python 服务器 运行 瓶子(使用表单或自定义 http 请求)
- Bottle 接收文件,将其作为 python 脚本的输入,接收结果并 return 到网页
在 bottle 的网站上有一个带有表格的示例:https://bottlepy.org/docs/dev/tutorial.html#file-uploads 我已经试过了并且有效。这是我使用的代码:
<html>
<head>
</head>
<body>
<form action="http://localhost:8080/solve" method="POST" enctype="multipart/form-data" norm="form" id='myForm'>
Select a file: <input type="file" name="upload"/>
<input type="submit" value="Start upload" />
</form>
</body>
</html>
瓶子里有:
@route('/solve', method='POST')
def solve():
file = request.files.get('upload')
name, ext = os.path.splitext(file.filename)
if ext not in ('.png','.jpg','.jpeg'):
return 'File extension not allowed.'
print(file.name)
resolved = sudoku.solve(file.file)
return str(resolved)
这个 "works",但是表单将我重定向到 localhost:8080,这不是我想要的。我尝试将目标放入隐藏的 iFrame,这会阻止重定向,但我无法访问 iFrame 主体中的结果...
我想要的是:发出类似于表单发出的 HTTP 请求。所以我尝试了:
<html>
<head> </head>
<body>
<form enctype="multipart/form-data" norm="form" id="myForm">
Select a file:
<input id="fileInput" type="file" name="upload" accept="image/png, image/jpeg, image/jpg" />
<input type="submit" value="Start upload" />
<label class="button-upload" onclick="send()">Upload</label>
</form>
</body>
<script>
var _file = null;
function send() {
var file = document.getElementById("fileInput").files[0]
console.log(file)
var url = "http://localhost:8080/solve";
var xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.setRequestHeader(
"Content-Type",
"multipart/form-data; boundary=---------------------------169461201884497922237853436"
);
var formData = new FormData();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
alert(xhr.responseText);
}
};
formData.append("upload", file);
xhr.send(formData);
}
</script>
</html>
我用网络开发工具查了一下,请求好像和表单发送的一样,但是bottle找不到文件。
file = request.files.get('upload')
returns None
和 file = request.files
returns <bottle.FormsDict object at 0x7ff437abf400>
所以有些东西,但我不明白如何访问它!
如有任何帮助,我们将不胜感激!
您的 JavaScript 代码看起来不错,除了您使用 xhr.setRequestHeader
设置请求 headers 的地方。 FormData
为您处理多部分编码,您无需手动设置请求 headers。我刚刚试过了,它似乎与 bottlepy 一起工作得很好。
总体而言,按如下方式更改 send()
函数:
function send() {
var file = document.getElementById("fileInput").files[0]
console.log(file)
var url = "http://localhost:8080/solve";
var xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
var formData = new FormData();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
alert(xhr.responseText);
}
};
formData.append("upload", file);
xhr.send(formData);
}