接下来我将介绍使用最小 WEB API 实现文件上传会遇到的坑的完整攻略。
如何使用最小 WEB API 实现文件上传?
在使用最小 WEB API 实现文件上传前,需要先了解前端如何向后端发送文件。通常情况下,我们使用 form
标签来发送文件。
<form enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>
在提交表单时,会将包含文件数据的 form-data
格式的数据通过 HTTP POST 请求发送到服务器端。在服务器端,我们需要用相应的后端框架(如 Flask、Django 等)来处理这个 form-data
数据。
使用 Flask 框架来处理数据的代码示例如下:
from flask import Flask, request
app = Flask(__name__)
@app.route('/upload', methods=['POST'])
def upload():
file = request.files['file']
file.save(f'./{file.filename}')
return '上传成功'
接下来让我们来看看使用最小 WEB API 实现文件上传会遇到哪些坑。
遇到的坑
跨域问题
由于浏览器的 Same Origin Policy 限制,前端向非同源的服务器发起请求时会被禁止。因此,如果前端代码和后端代码是分开部署的,就会遇到跨域问题。
解决跨域问题需要在后端代码中设置 Access-Control-Allow-Origin 头,如下所示:
from flask import Flask, request
app = Flask(__name__)
@app.after_request
def set_response_headers(response):
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['Access-Control-Allow-Methods'] = 'POST'
response.headers['Access-Control-Allow-Headers'] = 'Content-Type'
return response
@app.route('/upload', methods=['POST'])
def upload():
file = request.files['file']
file.save(f'./{file.filename}')
return '上传成功'
在上面的代码中,我们在所有响应中添加了允许跨域的头信息。
文件过大问题
在使用最小 WEB API 实现文件上传时,我们需要考虑文件过大的问题。如果我们一次性将整个文件读入内存中,可能会导致内存溢出的错误。
解决这个问题的方法是采用流式传输,即边读入边处理,而不是将整个文件读入内存中。以下是使用 Flask 框架实现流式传输的示例代码:
from flask import Flask, request
import os
app = Flask(__name__)
@app.after_request
def set_response_headers(response):
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['Access-Control-Allow-Methods'] = 'POST'
response.headers['Access-Control-Allow-Headers'] = 'Content-Type'
return response
@app.route('/upload', methods=['POST'])
def upload():
chunk_size = 1024 * 1024 # 分块大小,这里设置为 1MB
file = request.files['file']
filename = file.filename
# 创建一个临时文件来存储上传的文件
tmp_path = f'./tmp/{filename}'
with open(tmp_path, 'wb') as f:
while True:
chunk = file.stream.read(chunk_size)
if not chunk:
break
f.write(chunk)
# 将临时文件移动到目标位置,并删除临时文件
target_path = f'./{filename}'
os.rename(tmp_path, target_path)
return '上传成功'
在上面的代码中,我们通过将文件分成大小为 1MB 的块,分块读取文件,避免了一次性读取整个文件导致的内存占用过大的问题。
希望上述的攻略对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用最小 WEB API 实现文件上传会遇到的坑 - Python技术站