How to copy InMemoryUploadedFile object to disk

后端 未结 5 629
别那么骄傲
别那么骄傲 2020-11-29 02:09

I am trying to catch a file sent with form and perform some operations on it before it will be saved. So I need to create a copy of this file in temp directory, but I don\'t

相关标签:
5条回答
  • 2020-11-29 02:42

    This is similar question, it might help.

    import os
    from django.core.files.storage import default_storage
    from django.core.files.base import ContentFile
    from django.conf import settings
    
    data = request.FILES['image'] # or self.files['image'] in your form
    
    path = default_storage.save('tmp/somename.mp3', ContentFile(data.read()))
    tmp_file = os.path.join(settings.MEDIA_ROOT, path)
    
    0 讨论(0)
  • 2020-11-29 02:42

    This is how I tried to save the file locally

        file_object = request.FILES["document_file"]
        file_name = str(file_object)
        print(f'[INFO] File Name: {file_name}')
        with open(file_name, 'wb+') as f:
            for chunk in file_object.chunks():
                f.write(chunk)
    
    0 讨论(0)
  • 2020-11-29 02:45

    As mentioned by @Sławomir Lenart, when uploading large files, you don't want to clog up system memory with a data.read().

    From Django docs :

    Looping over UploadedFile.chunks() instead of using read() ensures that large files don't overwhelm your system's memory

    from django.core.files.storage import default_storage
    
    filename = "whatever.xyz" # received file name
    file_obj = request.data['file']
    
    with default_storage.open('tmp/'+filename, 'wb+') as destination:
        for chunk in file_obj.chunks():
            destination.write(chunk)
    

    This will save the file at MEDIA_ROOT/tmp/ as your default_storage will unless told otherwise.

    0 讨论(0)
  • 2020-11-29 03:02

    Here is another way to do it with python's mkstemp:

    ### get the inmemory file
    data = request.FILES.get('file') # get the file from the curl
    
    ### write the data to a temp file
    tup = tempfile.mkstemp() # make a tmp file
    f = os.fdopen(tup[0], 'w') # open the tmp file for writing
    f.write(data.read()) # write the tmp file
    f.close()
    
    ### return the path of the file
    filepath = tup[1] # get the filepath
    return filepath
    
    0 讨论(0)
  • 2020-11-29 03:04

    Your best course of action is to write a custom Upload handler. See the docs . If you add a "file_complete" handler, you can access the file's content regardless of having a memory file or a temp path file. You can also use the "receive_data_chunck" method and write your copy within it.

    Regards

    0 讨论(0)
提交回复
热议问题