web-dev-qa-db-ja.com

FILE_EXISTS_REPLACEがあるにもかかわらず、ファイル保存アップロードで既存のファイルが置き換えられない

ユーザーが新しいバージョンをアップロードした場合、同じ名前の既存のファイルを強制的に置き換えようとしています。私はこのトピックに関する多くの投稿を見てきましたが、置換を強制する方法を説明するものは見つかりませんでした。

私はカスタムフォームを使用しています。フォームの検証中に機能させようとしていたコードは次のとおりです。

  $file = file_save_upload(
      'file', 
      array(
        'file_validate_is_document' => array(), // Validates file is really a document.
        'file_validate_extensions' => array('pdf doc ppt pps avi mpg mov wmv'), // Validate extensions.
      ),
      'public://',
      FILE_EXISTS_REPLACE
  );

変更されたファイル(「file.jpg」としましょう)がアップロードされますが、必然的にDrupalは新しいコピーを作成し、新しいバージョンごとにfile_0.jpg、file_1.jpgなどに名前を変更します。

アップロードをコミットする前に "file_delete"を使用してプログラムで元のファイルを削除しようとしましたが、まだコピーを取得しています!

任意の助けいただければ幸いです。

7
longboardnode

これはdrupalのデフォルトの動作であり、既知の問題です。いくつかの方法で対処されています。

pload File Replace モジュールは、新しいファイルが元の名前を保持するようにファイル名を交換することにより、この問題に対処します。

Media Update モジュールを使用すると、メディアファイルをその場で置換できます( Media プロジェクトの一部)。

これらのモジュールのいずれかを使用するか、独自の関数のモデルとして使用できます。

5
Triskelion

私は次のコードを使用してそれを動作させることができました。

$file = file_save_upload('file', $validators);
// If the file passed validation:
if ($file) {
    // I PLACED IT IN THE NEXT LINE
    if ($file = file_move($file, 'public://', FILE_EXISTS_REPLACE)) {
        // Save the file for use in the submit handler.
        $form_state['storage']['file'] = $file;
    } else {
        form_set_error('file', t('Failed to write the uploaded file to the site\'s file folder.'));
    }
} else {
    form_set_error('file', t('No file was uploaded.'));
}
0