Имена файлов, хранящихся в базе данных и в Dropzone, различаются, что приводит к ошибке при удалении файла.Есть ли способ решить это? - PullRequest
0 голосов
/ 05 мая 2019

У меня есть Dropzone, куда пользователь загружает файлы.Когда он нажимает на удалить файл, файл удаляется с дисплея Dropzone.Но я хочу также удалить их из базы данных.

Проблема в том, что я не могу запросить базу данных, для удаленного файла, потому что имя файла, хранящегося на сервере dropzone и django, отличается в случае дублирования имен файловили когда в исходном имени файла есть пробел или специальные символы.

Я использую django 2.1.

Dropzone Code - я сохраняю имена файлов в массиве file_up_names.

success: function(file) {
      file_up_names.push(file_name);
        return file.previewElement.classList.add("dz-success");
      }

Функция удаления файла Dropzone -

removedfile: function(file) {
        var _ref;
        if ((_ref = file.previewElement) != null) {
          _ref.parentNode.removeChild(file.previewElement);
          var textArea = document.getElementById('text-area');
            ct -= 1
          textArea.innerText = ct
        }

      for(var i=0;i<file_up_names.length;++i){

      if(file_up_names[i]==file.name) {
      var delArea = document.getElementById('delete-check');
        var f = file_up_names.splice(i,1)
         //create an ajax request to delete the file. i.e. POST request to the DeleteView.
         //delete based on session key and file name match.
        var xmlhttp = new XMLHttpRequest();
        var url = "delete/";
        var  a = document.getElementById('session').innerText;
        url = url + a;
        url = url + "/";
        url = url + f;
        var delArea = document.getElementById('delete-check');
        xmlhttp.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                var myArr = JSON.parse(this.responseText);
                delArea.innerText = myArr.success;
            }
            else
            {

            delArea.innerText="not able to delete";}
        };
        xmlhttp.open("GET", url, true);
        xmlhttp.send();
        }}

URL для функции удаления выглядит следующим образом:

    path('upload/delete/<str:session>/<str:filename>/',delete_picture,name='delete'),

Файл сохраняется в папке изображений.И моя функция удаления файла выглядит следующим образом: -

def delete_picture(request, session, filename):
    found = None
    try:
        for obj in Picture.objects.all():
            print("filename is : ",obj.file.name)
            if obj.session == session and obj.file.name == "pictures/" + filename:
                found = obj
                break
    except:
        pass
    if found is not None:
        obj.delete()
        return JsonResponse({'success': True})
    else:
        return JsonResponse({'success': False})

Это прекрасно работает, когда у меня нет файлов с повторяющимися именами и когда в именах файлов нет специальных символов.Я ожидаю найти какой-нибудь способ удаления файлов из базы данных, когда пользователь нажимает кнопку удалить файл в зоне сброса, когда два файла с одинаковым именем или именем файла содержат специальные символы.

...