【问题标题】:Cannot Delete file if file renamed on Laravel如果文件在 Laravel 上重命名,则无法删除文件
【发布时间】:2020-05-07 12:50:59
【问题描述】:

我在服务器上重命名了我上传的文件,当我尝试通过 dropzone.js 删除我的图像时,该文件没有被删除,因为它被重命名了。

var myDropzone = new Dropzone("div#dropzoneFileUpload", {
  addRemoveLinks: true,
  url: baseUrl+"/img/upload/store",
  params: {
    _token: token,
  },
  success: function (data, textStatus, XmlHttpRequest){

  },

  removedfile: function(file) {

    var name = file.upload.filename;
    jQuery.ajax({
      headers: {
        'X-CSRF-TOKEN': jQuery('meta[name="_token"]').attr('content')
      },
      type: 'POST',
      url: '{{ url("delete") }}',
      data: {filename: name},
      success: function (data){
        console.log("File has been successfully removed!!");
      },
      error: function(e) {
        console.log(e);
      }});
    var fileRef;
    return (fileRef = file.previewElement) != null ?
        fileRef.parentNode.removeChild(file.previewElement) : void 0;

  },

});

【问题讨论】:

  • 我假设您在服务器端重命名它?如果是这样,您可以在对上传的响应中发回新文件名,以便您可以使用它而不是默认文件名?有了这个,您可以从 success() 方法中的 data 中获取新文件名
  • 是的,我正在服务器上重命名,我尝试使用 return response()->json(['success'=>'200','imagesname'=>$image] 返回新名称);但我不知道我可以获取图像的旧名称并将其更改为新名称
  • 你知道你也可以在上传之前直接在 Dropzone 中重命名文件吗?
  • 是的,但我想从服务器重命名它
  • 在成功方法中很好,您应该将上传的文件作为第一个参数(您当前拥有的数据)取回,第二个参数将是您发回的新名称(您目前有作为 textStatus)。有了这个,您可以循环 Dropzone 中的当前文件,根据您作为响应中的第一个参数返回的 file 从列表中找到正确的文件,然后相应地更改其名称。这样当你按下删除时,它就会有正确的名称

标签: laravel laravel-5 dropzone.js dropzone


【解决方案1】:

我提出以下建议:

在成功方法中,您应该将上传的文件作为第一个参数(您当前拥有的 data)取回,第二个参数将是您发回的新名称(您当前拥有的 @987654322 @)。

这样,您可以循环 Dropzone 中的当前文件,根据作为响应中的第一个参数返回的文件从列表中找到正确的文件,然后相应地更改其名称。这样当你按下删除时,它就会有正确的名称

请考虑以下修改后的伪代码,它假定您从服务器发回新文件名。

var myDropzone = new Dropzone("div#dropzoneFileUpload", {
   addRemoveLinks: true, 
   url: baseUrl+"/img/upload/store",
   params: {
    _token: token,
   },
  success: function (fileSentToServer, newFileName){
   // Access the current files in the list/dropzone
   var fileList =  myDropzone.files;
   // Loop over
   fileList.forEach(file => {
     //Find the corresponding file in the list you just uploaded
     if(file.name == fileSentToServer.name) {
       //Rename it
       file.name = newFileName
     }
   })
  }, 

 removedfile: function(file) {
    // This name should now be the renamed version
    var name = file.upload.filename;
    jQuery.ajax({...

 },

});

如果成功方法中返回的file 参数是对文件列表中文件的直接引用,您甚至可能不需要循环。

【讨论】:

  • 我收到以下错误:未捕获的类型错误:无法在成功方法中分配给对象“#”的只读属性“名称”
  • 好吧,不用file.name = newFileName 试试file.newName = newFileName。然后在removedFile方法中,使用var name = file.upload.newName;我只能做这么多,因为我无法编辑您的项目并查看自己的回复,但您应该在这里找到答案,以便弄清楚最后一点
猜你喜欢
  • 2018-02-24
  • 2018-10-11
  • 2012-07-08
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
相关资源
最近更新 更多