【问题标题】:Add existing image files in Dropzone在 Dropzone 中添加现有图像文件
【发布时间】:2014-08-18 04:53:20
【问题描述】:

我正在使用Dropzonejs 在表单中添加图像上传功能,因为我在表单中有各种其他字段,所以我将autoProcessQueue 设置为false 并在单击表单的提交按钮时对其进行处理,如下所示.

Dropzone.options.portfolioForm = { 

    url: "/user/portfolio/save",
    previewsContainer: ".dropzone-previews",
    uploadMultiple: true,
    parallelUploads: 8,
    autoProcessQueue: false,
    autoDiscover: false,
    addRemoveLinks: true,
    maxFiles: 8,

    init: function() {

         var myDropzone = this;
         this.element.querySelector("button[type=submit]").addEventListener("click", function(e) {

             e.preventDefault();
             e.stopPropagation();
             myDropzone.processQueue();
         });
     }
 }

这很好用,允许我处理提交表单时发送的所有图像。但是,当他再次编辑表单时,我也希望能够看到用户已经上传的图像。所以我浏览了 Dropzone Wiki 的以下帖子。 https://github.com/enyo/dropzone/wiki/FAQ#how-to-show-files-already-stored-on-server

它用现有图像填充dropzone-preview 区域,但这次它不发送带有表单提交的现有图像。我想这是因为这些图像没有添加到queue,但是如果是这样,那么如何在服务器端进行更新,以防用户删除现有图像?

另外,有什么更好的方法,在queue 中再次添加已经添加的图像,还是只发送已删除文件的信息?

【问题讨论】:

    标签: javascript ajax forms magento dropzone.js


    【解决方案1】:

    如果你有文件的 URL,你可以用 addFile 来添加文件。

    fetch("url")
        .then(res => res.blob())
        .then((currentBlob) => {
            const generateFile = new File([currentBlob], "filename.jpg", {
                type: currentBlob.type,
            });
            myDropzone.addFile(generateFile);
        });
    

    【讨论】:

      【解决方案2】:

      here 有一个官方常见问题解答

      【讨论】:

      • 我确认这适用于 2020 年 8 月的 Dropzone 5.7.2
      【解决方案3】:

      我使用 dropzone 内置的“displayExistingFile”方法解决了这个问题。

      在你的 init: 函数中。

      1. 创建模拟文件

        让 mockFile = { name: file.title, size: file.size, dataURL:};

      2. 调用displayExistingFile函数

        this.displayExistingFile(mockFile, , null, 'anonymous')

      您可以放置​​一个回调来响应缩略图加载事件,而不是“null”。

      “匿名”用于跨源属性。

      【讨论】:

      • 在我的 dropzone.js 版本 (v5.5) 中找不到 displayExistingFile 函数
      【解决方案4】:

      【讨论】:

      【解决方案5】:

      最初我这样做是为了以编程方式上传预先存在的文件:

      myDropzone.emit("addedfile", imageFile);                                
      myDropzone.emit("thumbnail", imageFile, imageUrl);
      myDropzone.files.push(file);
      

      但是,参考这个Dropzone Github Issue,我找到了一种更简单的直接上传方式:

      myDropzone.uploadFiles([imageFile])
      

      很遗憾,Dropzone Documentation 中没有对这个 uploadFiles 方法的引用,所以我想我会与所有 Dropzone 用户分享一些知识。

      希望这对某人有所帮助

      【讨论】:

      • 您的代码的第一部分是模拟上传过程,而不是真正向服务器发布任何内容。而myDropzone.uploadFiles([imageFile]) 正在发布到服务器,所以它们是不同的
      【解决方案6】:

      为了扩展 Teppic 的回答,我发现您需要发出完整事件以删除预览中的进度条。

      var file = {
          name: value.name,
          size: value.size,
          status: Dropzone.ADDED,
          accepted: true
      };
      myDropzone.emit("addedfile", file);                                
      myDropzone.emit("thumbnail", file, value.path);
      myDropzone.emit("complete", file);
      myDropzone.files.push(file);
      

      【讨论】:

      • status和accepted很重要,如果不放,maxFiles就会出错
      【解决方案7】:

      点击上传文件时,只需清除 dropzone 中的文件。 可以使用 removeAllFiles() 清除所有文件,也可以使用 removeFile(fileName) 删除特定文件。

      【讨论】:

        【解决方案8】:

        我花了一些时间尝试再次添加图像,但在与它斗争了一段时间后,我最终只是将有关已删除图像的信息发送回服务器。

        当使用现有图像填充 dropzone 时,我将图像的 url 附加到 mockFile 对象。在removedfile 事件中,如果要删除的文件是预先填充的图像(通过测试传递给事件的文件是否具有url 属性来确定),我会在表单中添加一个隐藏的输入。我在下面包含了相关代码:

        Dropzone.options.imageDropzone = {
            paramName: 'NewImages',
            autoProcessQueue: false,
            uploadMultiple: true,
            parallelUploads: 100,
            maxFiles: 100,
            init: function () {
                var myDropzone = this;
        
                //Populate any existing thumbnails
                if (thumbnailUrls) {
                    for (var i = 0; i < thumbnailUrls.length; i++) {
                        var mockFile = { 
                            name: "myimage.jpg", 
                            size: 12345, 
                            type: 'image/jpeg', 
                            status: Dropzone.ADDED, 
                            url: thumbnailUrls[i] 
                        };
        
                        // Call the default addedfile event handler
                        myDropzone.emit("addedfile", mockFile);
        
                        // And optionally show the thumbnail of the file:
                        myDropzone.emit("thumbnail", mockFile, thumbnailUrls[i]);
        
                        myDropzone.files.push(mockFile);
                    }
                }
        
                this.on("removedfile", function (file) {
                    // Only files that have been programmatically added should
                    // have a url property.
                    if (file.url && file.url.trim().length > 0) {
                        $("<input type='hidden'>").attr({
                            id: 'DeletedImageUrls',
                            name: 'DeletedImageUrls'
                        }).val(file.url).appendTo('#image-form');
                    }
                });
            }
        });
        

        服务器代码(asp mvc控制器):

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(ViewModel viewModel)
        {
            if (ModelState.IsValid)
            {
                foreach (var url in viewModel.DeletedImageUrls)
                {
                    // Code to remove the image
                }
        
                foreach (var image in viewModel.NewImages)
                {
                    // Code to add the image
                }
            }
        }
        

        希望对你有帮助。

        【讨论】:

        • 谢谢 Teppic,是的,我也必须这样做。 :)
        • 一点点改进:向 mockFile 添加“accepted: true”,因此 Dropzone 将文件识别为正确上传。例如,这启用了可上传文件的限制 ('maxFiles')
        • 谢谢 :) 工作就像一个魅力
        • 完美!谢谢你
        • 如果我添加一个文件并单击提交按钮,dropzone只会获取新添加的图像,现有图像会丢失,对吗?在这种情况下我能做什么?我如何在队列中添加现有图像以便接下来使用 processQueue() 方法?谢谢
        猜你喜欢
        • 2016-02-16
        • 2021-07-31
        • 2013-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多