Папка / каталог с загрузкой больших файлов в Django - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь загрузить папку с несколькими файлами, которые будут заархивированы перед сохранением в базу данных. Я следую ajax технике загрузки файлов и Django / python, чтобы выполнить sh это. Следующий код работает нормально, когда размер файла небольшой. Когда размер файла больше, он создает несколько маленьких файлов этого одного файла. Я думаю, это потому, что перед загрузкой всего файла моя программа начинает записывать уже полученный фрагмент этого файла.

Я считаю, что проблема в view.py, где я пишу загруженные файлы. Может кто-нибудь помочь мне советом, чтобы я мог решить эту проблему?

Я разместил изображение своего каталога до и после его загрузки. введите описание изображения здесь

View.py:

def handle_uploaded_file(upload_file,file_path,zipfile):
    full_path = "%s/%s" % (file_path, upload_file.name)
    for chunk in upload_file.chunks():
        zipfile.writestr(full_path,chunk)

def fileUploadView(request):       
    file_obj = file_store()  
    if request.method == "POST":
        filename = request.session.get('file_name')
        directory_name = request.POST.get('directories') 

        #write zip file with uploaded folder
        zipfile = ZipFile(filename,'a',ZIP_DEFLATED)
        json_to_dictionar = json.loads(directory_name)
        for upload_file in request.FILES.getlist('file'): 
            file_path = os.path.dirname(json_to_dictionar[upload_file.name])
            if os.path.exists(file_path):
               handle_uploaded_file(upload_file,file_path,zipfile)
            else:
               os.makedirs(file_path)
               handle_uploaded_file(upload_file,file_path,zipfile)
         zipfile.close()          
         file_obj.file = File(open(zipfile.filename,'rb'))
         file_obj.fileName = os.path.basename(zipfile.filename)
         file_obj.save()
         data = {'name':file_obj.fileName, 'url':file_obj.fileName}
         return render(request, 'fileupload_app/transfer_list/index.html',data)
     else:
         return render(request,'fileupload_app/basic_upload/test.html',{})

HTML Шаблон:

<form id="my-form" method="POST" action="{% url 'fileupload_app:basic_upload' %}" enctype="multipart/form-data">
{% csrf_token %}
     <div id="file-wrap">
         <p>Drag and drop file here</p>
         <input id="my-file" type="file" name="file" multiple webkitdirectory directory draggable="true">
         <input type="text" id="directories" name="directories" hidden />
     </div>
     <br>
     <input type="submit" value="upload">
 </form>

Ajax Функция:

$( function() { 
    $("#my-file").on('change', function (e) { // if file input value
        $("#file-wrap p").html('Now click on Upload button'); // change wrap message
    }); 
    $("#my-form").on('submit', function (e) { 
        files = document.querySelector("#my-file").files;
        var directories = {}
        for (var file of files) {
          file.webkitRelativePath
          directories[file.name] = file.webkitRelativePath
        }
        directories = JSON.stringify(directories);
        document.querySelector("#directories").value = directories 
        var eventType = $(this).attr("method");  
        var eventLink = $(this).attr("action"); 

        $.ajax({ 
            type: eventType, 
            url: eventLink, 
            data: new FormData( this ), 
            cache: false, 
            contentType: false, 
            processData: false, 
            success: function(getResult) { 
                $('#my-form')[0].reset();  
                $("#result").html(getResult);  
                $("#file-wrap p").html('Drag and drop file here');  
            } 
        }); 
        e.preventDefault(); 
    }); 
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...