实现图片上传到gogole picasa的步骤
Wednesday, May 13 18:09, 2009
2 comments/667 hits
要在app engine中使用google的picasa的上传服务,首先需要安装
Google Data Python Library包,步骤在此, 安装完毕后需要把src下的atom和gdata文件夹放到app的根目录。
然后,可以在python shell中使用python下耍耍这个功能。
这个时候遇到第一个问题:
对于file类的input元素,javascipt获得的是文件名,服务器端使用request.get获得的是文件的内容。幸好后来偶然知道了StringIO这个东西,哈哈,就是把字符串伪装成文件的,也就是传说中的a file-like object,那么接下来的任务就很简单了。
首先使用form中的file input元素把文件的内容传送到服务器,服务器收到数据后使用StringIO把它转化为a file-like object,然后就可以使用InsertPhotoSimple函数把图片上传到picasa了。该函数返回上传后的文件的"句柄",我们根据这个“句柄”来得到图片的外联地址。代码如下所示(注意使用gdata.url来覆盖uanshi的http_request_handler):
P.S. 插入图片的iframe在/upload下可以看到(为了防止低级别坏人滥用,所以我没有写超连接。)上传之后的图片会出现在我的picasa相册的bbblog目录。
总结一下:通过学习做这个按钮,我学习了以下的东西:
form的使用
iframe的使用
google data服务
超多javascipt使用,这语言真的很强大,但是很难用。
夕阳西下,回家了,哈哈!!
然后,可以在python shell中使用python下耍耍这个功能。
这个时候遇到第一个问题:
如上语句里面的fielname_or_handle,人家说是一个A file-like object or file name where the image/video will be read from。可惜我不太会python,所以不知道是个啥玩意。后来发现,这个东东可以使本地文件的绝对路径,哈哈。太nb了,至今我还不能获得用户选择的文件的绝对路径。。def InsertPhotoSimple(self, album_or_uri, title, summary, filename_or_handle,
content_type='image/jpeg', keywords=None)
对于file类的input元素,javascipt获得的是文件名,服务器端使用request.get获得的是文件的内容。幸好后来偶然知道了StringIO这个东西,哈哈,就是把字符串伪装成文件的,也就是传说中的a file-like object,那么接下来的任务就很简单了。
首先使用form中的file input元素把文件的内容传送到服务器,服务器收到数据后使用StringIO把它转化为a file-like object,然后就可以使用InsertPhotoSimple函数把图片上传到picasa了。该函数返回上传后的文件的"句柄",我们根据这个“句柄”来得到图片的外联地址。代码如下所示(注意使用gdata.url来覆盖uanshi的http_request_handler):
import gdata.urlfetch*另外注意密码保护,由于本程序可以在google code上下载到,所以密码我保存到本机的bbpsw类中,然后定义一个方法getpassword得到密码,或许由更好的方法,但是我不想在每次上传图片的时候跳转到别的页面,所以还是采用这种方法了。 还遇到一个问题:就是图片上传完毕之后,服务器端不好触发客户端的javascript程序,所以我直接产生一个use it的超链接,触发javascript函数,把图片的地址做成img标签,然后加入到编辑页面中。如果不这么做,或许我需要ajax?我不想学那么多新东西啊。。。
gdata.service.http_request_handler = gdata.urlfetch
#override original http handler
...
filename = self.request.get('imgfile')
filetitle = self.request.get('imgtitle')
file_handle = StringIO.StringIO(filename)#convert string to file-like object
gd_client = gdata.photos.service.PhotosService()
gd_client.email = 'gzguoer@gmail.com'
gd_client.password = bbpsw.getpassword()
gd_client.source = 'blowblood-upload-image'
gd_client.ProgrammaticLogin()
album_url = '/data/feed/api/user/gzguoer/albumid/5334765855583692065'
try:
photo = gd_client.InsertPhotoSimple(album_url, 'blogimg',filetitle,
file_handle,content_type='image/jpeg')
template_values = {
'imgtitle':'title',
'img_url':photo.GetMediaURL(),
'response':'upload_complelted,<a href="javascript:getimgurl()">use it</a>',
}
path = os.path.join(os.path.dirname(__file__), '../templates/upload.html')
self.response.out.write(template.render(path, template_values))
except gdata.service.RequestError:
self.response.out.write(GooglePhotosException)
P.S. 插入图片的iframe在/upload下可以看到(为了防止低级别坏人滥用,所以我没有写超连接。)上传之后的图片会出现在我的picasa相册的bbblog目录。
总结一下:通过学习做这个按钮,我学习了以下的东西:
form的使用
iframe的使用
google data服务
超多javascipt使用,这语言真的很强大,但是很难用。
夕阳西下,回家了,哈哈!!

Recent Comments