从html表单获取文件位置

时间:2014-06-19 16:08:48

标签: python html file upload

编辑:按照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的建议,为我的代码添加了解决方案。

1 个答案:

答案 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)