2016-10-17 7 views
1

私はDebianサーバー上にDjangoアプリケーションを持っており、現在のディスクの現在のsite_mediaディレクトリは一杯です。だから私は2番目のディスクにファイルをアップロードしたい。サーバー上のパスは/ディスクです:django app複数のハードドライブ[Errno 18]デバイス間のリンクが無効

 obj = form.save(commit=False) 
     obj.user_id = self.request.user.pk 
     obj.save() 
     initial_path = obj.file.path 
     print(initial_path) 
     new = settings.MEDIA_ROOT_NEW + obj.file.name 
     print(new) 
     os.rename(initial_path,new) 
     shutil.move(initial_path, new) 

と私は私のsettings.pyに: ジャンゴ[ERRNO 18]無効なクロスデバイスリンク

 MEDIA_ROOT = os.path.join(PROJECT_PATH, 'site_media/') 
     MEDIA_ROOT_NEW = '/disk/site_media/' 

まだ私はエラーを取得します

アイデア?

+0

これを振り返ってみると、アプリが元の場所にデータを保存してからコピーするのではなく、単に新しい場所に移行する方が意味があります。 'MEDIA_ROOT'を'/disk/site_media/'に変更できませんか? –

+0

ご覧のとおり、2つのディスクがあります。最初(MEDIA_ROOT)がいっぱいです。私たちはそれをそのままにしなければなりません。 2番目のディスクにMEDIA_ROOT_NEWパスでファイルをアップロードし、そのディスクからもファイルを読み込むように管理する必要があります。何か案は?? –

+0

私は適切な解決策を思いつくことは、SOのコメント以上の会話を必要とすると思います。なぜあなたは 'MEDIA_ROOT'をそのままにしておかなければならないのかについての正確な理由を知らずに、私はまだ「より大きなディスクを取得し、現在のデータを' MEDIA_ROOT'から移行して、あなたのアプリケーションを新しいディスクに向ける」ことを勧めます。よりシンプルです - 両方のディスクに読み書きを調整しなければならない理由を考えることはできません。 –

答えて

2

os.rename()across異なるファイルシステムが失敗することがあります。

The operation may fail on some Unix flavors if src and dst are on different filesystems.

shutil.move()should仕事

If the destination is on the current filesystem, then os.rename() is used. Otherwise, src is copied (using shutil.copy2()) to dst and then removed.

が、あなたは自分のshutil.move(initial_path, new)os.rename(initial_path,new)を持っています。最初のos.rename()を削除しても問題ありません。

+0

まず、ありがとうございます! –

+0

Sooryがそこに入る!私はあなたが言ったことをし、それは完全に働いた。今のところ、/ disk/site_mediaパスから読み取られないということです。ファイルが見つからないというエラーが表示される –

+0

正確なファイルパスがわからず、システム上のファイルをチェックできない場合は、「ファイルが存在していますか? "印刷ラインでログアウトしたファイルが存在していますか? –

関連する問題