如何在保存文件时避免保存子文件夹?

问题描述 投票:0回答:1

该函数创建一个文件夹并将文件保存到其中。然后将该文件夹打包到一个rar存档中并发送给用户,之后,新创建的文件夹和存档将从服务器中删除。

code.py

new_file_name = self.generate_file_name(rfi, vendor, current_scoring_round)

path_to_temp_folder = os.path.dirname(BASE_DIR)
if not os.path.exists(f'{path_to_temp_folder}/temp_folder'):
    pathlib.Path(f'{path_to_temp_folder}/temp_folder').mkdir(parents=True, exist_ok=True)

wb.save(f'{path_to_temp_folder}/temp_folder/{new_file_name}') #save xlsx file from openpyxl library

archive = self.generate_zip_name(rfi) # generate name for archive

to_rar = f'{path_to_temp_folder}/temp_folder'
patoolib.create_archive(archive, (to_rar,))  # patoolib - to .rar converter 

to_download = f'{path_to_temp_folder}/{archive}'

if os.path.exists(to_download):
try:
    with open(to_download, 'rb') as fh:
        response = HttpResponse(fh.read(),
                                content_type="content_type='application/vnd.rar'")
        response['Content-Disposition'] = 'attachment; filename= "{}"'.format(archive)
        return response
finally:
    shutil.rmtree(to_rar, ignore_errors=True)
    default_storage.delete(to_download)

一切正常,但问题是下载的档案包含子文件夹-所保存文件的路径。

预期结果:

folder.rar
    file.xlsx

实际结果:

folder.rar
    /home
        /y700
            /projects
                file.xlsx
python django rar
1个回答
0
投票

patool的文档很小。显然似乎暗示这应该通过在create-archive命令中将路径传递到文件来实现。我也尝试过,但似乎没有。

因此,唯一的选择可能是将工作目录更改为test.xlsx文件的位置:

import patoolib
import os

new_file_name = self.generate_file_name(rfi, vendor, current_scoring_round)

path_to_temp_folder = os.path.dirname(BASE_DIR)
if not os.path.exists(f'{path_to_temp_folder}/temp_folder'):
    pathlib.Path(f'{path_to_temp_folder}/temp_folder').mkdir(parents=True, exist_ok=True)

wb.save(f'{path_to_temp_folder}/temp_folder/{new_file_name}') #save xlsx file from openpyxl library

archive = self.generate_zip_name(rfi) # generate name for archive

to_rar = f'{path_to_temp_folder}/temp_folder'

cwd=os.getcwd()
os.chdir('to_rar')
patoolib.create_archive(cwd+archive, ({new_file_name},))  # patoolib - to .rar converter     
os.chdir('cwd')

to_download = f'{path_to_temp_folder}/{archive}'

if os.path.exists(to_download):
try:
    with open(to_download, 'rb') as fh:
        response = HttpResponse(fh.read(),
                                content_type="content_type='application/vnd.rar'")
        response['Content-Disposition'] = 'attachment; filename= "{}"'.format(archive)
        return response
finally:
    shutil.rmtree(to_rar, ignore_errors=True)
    default_storage.delete(to_download)

例如,这在我的系统上有效:

import patoolib
import os

cwd=os.getcwd()
os.chdir('foo/bar/baz/qux/')
patoolib.create_archive(cwd+'/foo.tar.gz',('test.txt',))
os.chdir(cwd)

请注意,您应该真正使用os.path.join而不是连接字符串,但这只是一个快速而肮脏的测试。

© www.soinside.com 2019 - 2024. All rights reserved.