-1

登録ユーザーが一部のファイルをPDFとしてMEDIA_ROOT(usermediaディレクトリという名前)にアップロードすると、ドキュメントは12345676542.pdfとしてディレクトリに保存されます。この番号は、登録時に付与されるユーザーOIB番号です。

def handle_uploaded_file(f,wusr):
    nname = "%s.%s" % (str(wusr.oib), f.name.split(".")[1])
    print nname
    destination = open('%s/%s' % (MEDIA_ROOT, nname), 'wb+')
    for chunk in f.chunks():
        destination.write(chunk)
    destination.close()

ただし、ユーザーが別のドキュメントをアップロードする場合、このドキュメントは前のドキュメントとして保存されます

ユーザーが12345676542-1.pdfという名前のgethファイルに別のファイルをアップロードするタイミングを設定する方法

4

3 に答える 3

1

そのユーザーが最後に使用したインデックスのデータ ストアを維持するか、ファイル システムでそのユーザーの既存のファイルを検索し、最初に使用されていない (または最後に使用された) インデックスを見つけて、それを使用して新しいファイルを作成する必要があります。

于 2012-04-05T14:54:25.790 に答える
0

解決策の例を次に示します。私はこれをテストしていないので、構文エラーがある可能性があることに注意してください。これを提案として扱います。

def handle_uploaded_file(f,wusr):
    nname = "%s.%s" % (str(wusr.oib), f.name.split(".")[1])
    nname = unique(nname)
    destination = open('%s/%s' % (MEDIA_ROOT, nname), 'wb+')
    for chunk in f.chunks():
        destination.write(chunk)
    destination.close()

# Return unique file name in format <filename>-<num>.<ext>
def unique(path):
    import os.path
    num = 0
    newpath = path

    def fileExists(path):
        return os.path.isfile(path)

    # Keep incrementing until an unique filename is reached
    while fileExists(newpath):
        num += 1
        pieces = path.rsplit('.', 1)
        newpath = "%s-%d.%s" % (pieces[0], num, pieces[1])

    return newpath

このunique関数は、一意であることが保証された新しいファイル名を生成します。間隔ごとにディスクをチェックするこの特定のソリューションは、同じ名前のアップロードが多数に達した場合に問題になる可能性があります。このソリューションの速度が問題であることが判明した場合は、ディレクトリ内のすべてのファイルを最初にリストし、代わりにその文字列に対して上記の操作を実行してください。これにより、ディスク操作の回数がxから 1に減少します

于 2012-04-05T15:03:35.753 に答える
0

コードは、適切な未使用のファイル名が見つかるまで、既存のファイルをチェックする必要があります。このようなもの:

import os

filename = base_filename = '123456765432'
ext = '.pdf'
suffix = 0
while os.path.exists(filename+ext):
    suffix += 1
    filename = '%s-%d' % (base_filename, suffix)
于 2012-04-05T15:04:43.000 に答える