4

我正在研究 FineUploader 的实现。特殊要求是在客户端即时创建缩略图,然后使用原始 image-upload 上传这些缩略图。

我有一个适用于 FF 的实现,但似乎不适用于 iO。它看起来像这样:

var uploader = new qq.FineUploaderBasic({
  button: document.getElementById(buttonID),
  request: {
    endpoint: '/up/load/a/' + $('section#ajax-viewport').data('albumid')
  },
  callbacks: {
    onSubmit: function(id, fileName) {

            // getFile obtains the file being uploaded
        file = this.getFile(id); 
            // create a thumbnail & upload it:
        ThumbDown(file, id, 200, fileName);
    },
  }
}) 

此代码调用一个函数:

function ThumbDown(file, id, dimension, fileName) {

var reader = new FileReader();  
reader.onload = function(e) {
    var img = document.createElement("img");
    img.onload = function (ev) {
        var thumbnailDimensions; // object holding width & height of thumbnail
        var c=document.getElementById("canvas-for-thumbnails"); // must be a <canvas> element
        var ctx=c.getContext("2d");
            // set thumbnail dimensions of canvas:
        thumbnailDimensions = calcThumbnailDimension (img.width, img.height, dimension )
        c.width = thumbnailDimensions.width;
        c.height = thumbnailDimensions.height;

        var ctx = c.getContext("2d");
        ctx.drawImage(img, 0, 0, c.width, c.height);
        uploadThumbnail(c.toDataURL('image/jpeg'), //a base64 encoded representation of the image
                        id,               
                        fileName);       // we need filename to combine with mother-image on the server
    };
    img.src = e.target.result;
}
reader.readAsDataURL(file);
} // end function

最后,缩略图通过哑 ajax 调用上传:

function uploadThumbnail (base64encodedString, id, fileName) {

  $.post('/up/thumb',
  {
    img : base64encodedString,
    id: id,
    fileName: fileName
  },
  function(data) {});
}

我的问题:

1)目前我有两个上传:一个用于母图,另一个用于缩略图。我想将其合并到一个 FineUploader 调用中。但是,由于我的缩略图创建的异步性质,我看不到这样做的方法。

我错过了什么吗?这可以减少到一个 FineUploader 调用吗?

2) 此代码将缩略图作为 base64 编码字符串上传。我想将缩略图作为图像(或作为blob?)上传。也许通过遵循Jeremy Banks 的这个食谱。这适用于 FineUploader 吗?

3) 还有其他我错过但我应该使用的 FineUploader 选项/方法吗?

一如既往,非常感谢任何帮助。

4

2 回答 2

3

因此,上传原始图像已经很简单了。Fine Uploader 会为您解决这些问题。如果我理解正确,您还想上传图像的缩放版本(您已经生成)。我建议您将绘制到画布上的图像转换为Blob. 然后,您可以Blob直接将其提交给 Fine Uploader,它会为您上传。

例如,将 的值更改为uploadThumbnail

function uploadThumbnail(thumbnailDataUri, id, filename) {
    var imageBlob = getImageBlob(thumbnailDataUri, "image/jpeg"),
        blobData = {
            name: filename,
            blob: imageBlob
        };

    // This will instruct Fine Uploader to upload the scaled image
    uploader.addBlobs(blobData);
}  

function getImageBlob(dataUri, type) {
    var binary = atob(dataUri.split(',')[1]), 
        array = [];

    for(var i = 0; i < binary.length; i++) {
        array.push(binary.charCodeAt(i));
    }

    return new Blob([new Uint8Array(array)], {type: type});
}

注意:该getImageBlob函数改编自此 Stack Overflow 答案。如果这对您有用,请务必支持我链接到的答案。

服务器端说明

ABlob几乎是File没有name属性的。您的服务器端代码将处理上传的方式与处理包含表单字段的表单提交的Blob方式几乎相同。您的服务器唯一明显的区别是包含文件的多部分边界的 Content-Disposition 标头中的文件名参数值。换句话说,您的服务器可能会认为图像被命名为“blob”或其他通用名称,因为大多数浏览器生成包含File<input type="file">Blob对象。Fine Uploader 应该能够通过显式指定浏览器的文件名以包含在 blob 的 Content-Disposition 标头中来解决此问题,但此功能没有广泛的浏览器支持。Fine Uploader 通过在包含Blob.

未来对缩略图生成和缩放的原生支持

该计划是为 Fine Uploader 添加对缩略图预览的原生支持。这在功能请求#868#896中有所介绍。还有其他相关的功能请求打开,例如图像旋转与图像相关的验证。这些功能和其他与图像相关的功能可能会在不久的将来添加到 Fine Uploader。如果您愿意,请务必评论现有的功能请求或添加其他请求。

于 2013-08-26T15:22:58.397 回答
3

从 FineUploader 的 4.4 版开始,正如 Ray Nicholus 指出的最终会发生的那样,这个功能已经融入了他们的框架。

以下是在创建 FineUploader 实例时设置上传大小的示例:

var uploader = new qq.FineUploader({
...
scaling: {
    sizes: [
        {name: "small", maxSize: 100},
        {name: "medium", maxSize: 300}
    ]
}
});

请参阅他们关于上传缩放图像的页面

于 2014-06-11T20:59:09.133 回答