jquery - 使用 JQuery GAE Dropload 时出现问题 - 通过拖放上传 Blobstore

标签 jquery google-app-engine jakarta-ee

我想在我的网页上实现拖放文件以将文件上传到 Google Blobstore。关于该主题的资源很少。实现这一目标的最简单方法之一似乎是使用 Jude Osborn jquery.gaedropload

对于像我这样技术较差的开发者来说,插件的描述不是很详细。但我终于让它工作了(因为经常在 Stackoverflow 上写我的问题让我明白我的代码出了什么问题)

我会回答我自己的问题,希望这也能帮助其他人。

最佳答案

也许这对于经验丰富的开发人员来说是显而易见的,但我花了几个小时(不计算天数)。在开始使用 jquery.gaedropload 之前,我从具有经典 HTML 表单的工作页面开始将图像上传到 Blobstore。

  • 需要使用 jQuery 2.x(使用 jQuery 1.x 插件会失败并出现一些错误)。也许这很正常,因为插件使用 HTML5 new FormData()
  • generate_url:文档说:

A GAE URL that returns a blobstore URL.

我们需要返回之前在表单中指定的 URL(当使用 <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上传后调用的post:

    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]));

获取更新后的图像。

在我了解它是多么容易使用之后,这是一个很棒的插件。

关于jquery - 使用 JQuery GAE Dropload 时出现问题 - 通过拖放上传 Blobstore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17649311/

相关文章:

jquery - 如何为多个元素设置脚本

css - jquery live() 点击函数 : class not being removed

javascript - 如何使用 ajax 从下拉菜单更新 mysql 数据库

java - AppEngine Blob 上传速度极慢

jakarta-ee - 如何在 JBoss AS 7 中配置 2 个持久性提供程序

javascript - CSS/Javascript 加载太晚

java - 所选的 App Engine SDK 无效

python - Appengine GET 参数

java - 如何在类的 Timer 方法中可见 HTML 标记组件

java - 适用于 Java EE 和 hibernate 的 Maven Artifact