我想将带有表单的图像上传到enpoints api。上传和保存到谷歌云存储似乎正在运作。
但是如果我点击开发者控制台中的图像,它只显示一个16x16像素的空图像,而不是原始图像。
我做错了什么?
<form action="https://xyz.appspot.com/_ah/api/undergogo/v1/image"
target="_blank"
enctype="multipart/form-data"
method="post"
onchange="readImage();">
<input type="text" name="desc"/>
<input id="fileInput" type="file" name="imgFile"/>
<input id="fileInputBase64" type="hiden" name="img" />
<input type="submit" value="upload">
</form>
编码到base64并将字符串保存在隐藏字段fileInputBase64中。
function el(id){return document.getElementById(id);} // Get elem by ID
function readImage() {
if ( el("fileInput") && el("fileInput").files[0] ) {
var FR= new FileReader();
FR.onload = function(e) {
el("fileInputBase64").value = e.target.result;
};
FR.readAsDataURL( el("fileInput").files[0] );
}
}
API
@endpoints.method(ImageMessage, Status,
path='image', http_method='POST',
name='image.upload')
def image_upload(self, request):
my_default_retry_params = gcs.RetryParams(initial_delay=0.2,
max_delay=5.0,
backoff_factor=2,
max_retry_period=15)
bucket_name = os.environ.get('xyz.appspot.com',app_identity.get_default_gcs_bucket_name())
bucket = '/' + bucket_name
filename = bucket + '/demo-image2o.jpg'
self.tmp_filenames_to_clean_up = []
# write file
gcs_file = gcs.open(filename,
'w',
content_type='image/jpeg')
gcs_file.write(request.img.decode('base64'))
gcs_file.close()
self.tmp_filenames_to_clean_up.append(filename)
return Status(code=0,message=request.desc)
ImageMessage类:
class ImageMessage(messages.Message):
url = messages.StringField(1)
desc = messages.StringField(2)
img = messages.BytesField(3)