我想在我的网页上实现拖放文件以将文件上传到 Google Blobstore。关于该主题的资源很少。实现这一目标的最简单方法之一似乎是使用Jude Osborn jquery.gaedropload
对于像我这样技术不好的开发人员来说,插件的描述不是很详细。但我终于让它工作了(经常开始在 Stackoverflow 上写我的问题让我明白我的代码有什么问题)
我会回答我自己的问题,希望这也可以帮助其他人。
我想在我的网页上实现拖放文件以将文件上传到 Google Blobstore。关于该主题的资源很少。实现这一目标的最简单方法之一似乎是使用Jude Osborn jquery.gaedropload
对于像我这样技术不好的开发人员来说,插件的描述不是很详细。但我终于让它工作了(经常开始在 Stackoverflow 上写我的问题让我明白我的代码有什么问题)
我会回答我自己的问题,希望这也可以帮助其他人。
对于有经验的开发人员来说,这可能是显而易见的,但我花了几个小时(不计算天数)。在开始使用 jquery.gaedropload 之前,我从一个带有经典 HTML 表单的工作页面开始,将图像上传到 Blobstore。
返回 Blobstore URL 的 GAE URL。
我们需要返回我们之前在表单中指定的 URL(当使用 an<input type="file" name="uploadedFile" />
上传文件时)。在我们使用的 JSP 文件中:<form action="<%= blobstoreService.createUploadUrl("/uploadimage") %>"
因此我们需要编写的get函数是这样的:
public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
response.setContentType("text/html");
response.setCharacterEncoding( "UTF-8" );
PrintWriter out = response.getWriter();
out.println(blobstoreService.createUploadUrl("/uploadimage"));
}
我们不能再指定输入的名称(在我们使用之前:) name="uploadedFile"
。现在名称将由插件设置为file0
. 因此我们需要修改 Blobstore 上传后调用的帖子:
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(request);
List<BlobKey> blobKeys = blobs.get("file0"); //Before was: uploadedFile
在发布表单以上传图片时,我们需要额外的参数(以识别上传的图片)。在它们形成之前:
<input type="hidden" name="setName" value="${ setName }">
<input type="hidden" name="imageId" value="3">
现在我们需要在调用 extraFormData 插件时指定它们:
$('#image3').gaeDropload( {
extraFormData: { setName: "${ setName }", imageId: 4 },
dragover: function() { //Show we can drop here
$('#image3').css('background', 'red');
},
dragleave: function() { //Show we cannot drop anymore
$('#image3').css('background', '');
},
afterDrop: function() { //Show we cannot drop anymore
$('#image3').css('background', '');
}
}); //gaeDropload
还可以添加拖放功能以向用户显示他可以拖放的位置。
image3 只是图像周围的 div:
<div class="span1 thumbnail" id="image3" ><img src="<%=set.getImageUrl(3)%>" alt=""></div>
最后一点是在上传后刷新图像。我们需要另一个 get 来返回新的图像 URL。调用插件时,我们添加:
dropSuccess: function() { //Async call to get the new uploaded image
$.ajax({
url: '/blobimage?setName=${ setName }&buttonId=4',
async: true, //useless to specify, this is default
success: function(data) {
$('#image3 > img').attr('src', data); //get img inside div
}
});
get 会调用
ImagesService imagesService = ImagesServiceFactory.getImagesService();
imagesService.getServingUrl(ServingUrlOptions.Builder.withBlobKey(images[index]));
获取更新的图像。
在我了解它的易用性之后,这是一个很棒的插件。