编辑:按照Martijn Pieters的建议,为我的代码添加了解决方案。
我正在编写一个应该具有图片上传功能的网络应用程序。实际上它是通过他们的api直接上传到imgur.com。到目前为止,我可以通过运行我的python脚本通过终端上传图像到imgur。但我希望用户能够通过html表单选择图像。所有我真正需要的(我认为)是文件的路径,然后我有一个脚本将图像转换为base64。在我写这篇文章时,我意识到脚本可能仅在本地运行时才有效,而不是从浏览器运行。我一直在谷歌上搜索两天。我得到了很多关于cgi.FieldStorage()的结果,但似乎无法让我工作,因为我得到了一个KeyError。
这是我表单的文件输入部分:
<div class="container">
<form role="form" class="form-horizontal form-inline" method="post" enctype="multipart/form-data">
<div class="col-md-12">
<div class="form-group">
<label for="image" class="control-label">Product image</label>
<input type="file" id="image" name="imageurl" value=""/>
</div>
</div>
然后我需要能够处理我的python脚本中的输入:
class MainPage(BlogHandler):
def get(self):
self.render("front.html")
def post(self):
image = self.request.POST.get("imageurl")
logging.info(getUrl(image))
这是将图像发送到imgur api的代码:
def getUrl(image):
API_URL = "https://api.imgur.com/3/upload.json"
image_read = image.file.read()
b64 = base64.b64encode(image_read)
data = {
'image': b64,
'type': base64,
'title': 'testupload'
}
response = requests.post(API_URL, data, headers={'Authorization': 'Client-ID my-cient-id'})
url = response.json()['data']['link']
return url
我在Google App Engine中开发并使用Jinja2作为模板引擎。
我是初学程序员,所以我希望能对我的问题有所了解。我觉得我一直在寻找答案。我已经读过,出于安全原因,浏览器对计算机的文件系统一无所知,但是存在可以从计算机中选择要上传的文件的网站,所以我认为必须能够实现。 :)
编辑:按照Martijn Pieters的建议,为我的代码添加了解决方案。
答案 0 :(得分:0)
上传图片需要您将表单编码更改为multipart/form-data
:
<form encoding="multipart/form-data" role="form" class="form-horizontal form-inline" method="post">
请参阅application/x-www-form-urlencoded or multipart/form-data?
因为这是POST
请求,您会在request.POST
中找到字段:
def post(self):
imageurl = self.request.POST.get("imageurl")
logging.info(imageurl)
虽然request.get()
将搜索查询参数和POST表单数据。
表单上传作为cgi.FieldStorage()
对象返回;它有一个file
属性,可以为您提供类似文件的界面。你可以把数据读入内存:
image = self.request.POST.get("imageurl")
image_read = image.file.read()
b64 = base64.b64encode(image_read)