@app.route("/upload", methods=['POST'])
async def omo(request):
from sanic import response
import os
import aiofiles
if not os.path.exists(appConfig["upload"]):
os.makedirs(appConfig["upload"])
async with aiofiles.open(appConfig["upload"]+"/"+request.files["file"][0].name, 'wb') as f:
await f.write(request.files["file"][0].body)
f.close()
return response.json(True)
async def process_upload(request):
# Create upload folder if doesn't exist
if not os.path.exists(app.config.UPLOAD_DIR):
os.makedirs(app.config.UPLOAD_DIR)
# Ensure a file was sent
upload_file = request.files.get('file_names')
if not upload_file:
return redirect("/?error=no_file")
# Clean up the filename in case it creates security risks
filename = secure_filename(upload_file.name)
# Ensure the file is a valid type and size, and if so
# write the file to disk and redirect back to main
if not valid_file_type(upload_file.name, upload_file.type):
return redirect('/?error=invalid_file_type')
elif not valid_file_size(upload_file.body):
return redirect('/?error=invalid_file_size')
else:
file_path = f"{app.config.UPLOAD_DIR}/{str(datetime.now())}.pdf"
await write_file(file_path, upload_file.body)
return redirect('/?error=none')
4条答案
按热度按时间hsvhsicv1#
经过长时间的努力,我发现下面的代码是工作
6mzjoqzu2#
上面的答案很好。还有一些小的改进:
(1)因为我们使用的是Sanic,所以让我们尝试异步处理文件io:
(2)请确保该文件不会太大而导致服务器崩溃:
(3)检查文件名和文件类型,以确定文件类型是否正确:
(4)确保文件名中没有危险/不安全的字符。您可以使用werkzeug.utils中的secure_filename函数:http://flask.pocoo.org/docs/0.12/patterns/fileuploads/
(5)此代码将所有功能组合在一起:
我写了一篇博文,介绍了我如何在Sanic中处理文件上传。我添加了一些文件验证和异步文件写入。我希望其他人会觉得这很有帮助:
https://blog.fcast.co/2019/06/16/file-upload-handling-using-asynchronous-file-writing/
lzfw57am3#
下面是一个特定文件类型的文件上传示例(这个是pdf文件)
有关其他请求类型的示例,请参阅官方文档(https://sanic.readthedocs.io/en/latest/sanic/request_data.html)
ajsxfq5m4#
上面的答案忽略了html文件的必要存在。也有一些bug在那里。现在我发布我的答案,在我的机器上工作。
代码结合了sanic和html。
以上不仅接收上传的文件,而且在另一个文件中返回响应。希望这对很多人有帮助。