• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:同じ名前のファイルが上書きされる場合の対処法)

同じ名前のファイルが上書きされる場合の対処法

このQ&Aのポイント
  • 同じ名前のファイルが上書きされる場合の対処法についてお助けください。
  • ubercart_marketplaceモジュールを利用していて、ファイル名に日付を付与したい。
  • mp_file.moduleのコードを追記することで、ファイル名に日付を付与できるが方法が分からない。PHP初心者のため、具体的な追記箇所について教えてほしい。

質問者が選んだベストアンサー

  • ベストアンサー
  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.2

申し訳ない。ファイル名に日付と時間をつけたいのでしたね。 それでしたら、上が $new_file_name = $node_id."_".$file_name."_".date("YMDHis").".".$file_name_ext; while内では $new_file_name = $node_id."_".$file_name."_".date("YMDHis")."_". sprintf("%03d", $i_file).".".$file_name_ext; でいけるかと。

midorinodonchan
質問者

お礼

いつもご回答ありがとうございます。 引き続きよろしくお願いいたします。

midorinodonchan
質問者

補足

ご回答ありがとうございます! ご指摘の通り、以下のように変更してみましたが、やはり日付と時間はついてくれませんでした。。。 -------------- function mp_file_mp_file_name($dir, $file_name, $file_name_ext, $node_id, $title) { $node_sanitized_title = preg_replace('/[^0-9a-z\.\_\-]/i', '', $title); $new_file_name = $node_id . "_" . $file_name . "_" .date("YMDHis"). "." . $file_name_ext; $i_file = 0; while( file_exists("$dir/$new_file_name")){ $i_file++; $new_file_name = $node_id . "_" . $file_name . "_" .date("YMDHis"). "_" . sprintf("%03d", $i_file) . "." . $file_name_ext; } return $new_file_name; } -------------- このコードの前に以下のようなコードもあるのですが、こちらも変更する必要はありますでしょうか? -------------- /** * Transfers file download from files directory to file download directory. * Programatically fills out "product feature form" to commit file. * * TODO: add support for model field */ function mp_file_commit($node, $file_path, $description, $title, $fid) { // Check if paths are correctly set $dir = variable_get('uc_file_base_dir', NULL) .'/'; if (!is_dir($dir)) { drupal_set_message('File download directory not set.', 'error'); return FALSE; } // Rename file... $file_name = drupal_substr(basename($file_path), 0, strrpos(basename($file_path), ".")); $file_name_ext = drupal_substr(basename($file_path), strrpos(basename($file_path), ".") + 1); $new_name_hook = module_invoke_all('mp_file_name', $dir, $file_name, $file_name_ext, $node->nid, $title); $new_name = $new_name_hook[count($new_name_hook)-1]; // Finally, copy the file to a more secure directory copy($file_path, $dir . $new_name); //Insert the file to the uc_files table so it will pass validation $result = db_query("INSERT INTO {uc_files} (fid,filename) VALUES (%d,'%s')", $fid, $new_name); // programatically fill out product feature form $form_state = Array(); $form_state['values']['uc_file_filename'] = $new_name; $form_state['values']['uc_file_description'] = $description; $submitted = drupal_execute('uc_file_feature_form', $form_state, $node, array()); return TRUE; } --------------

その他の回答 (3)

  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.4

ファイル名を決定している箇所がわからなければお手上げです。 何とかその箇所を見つけるしかありません。(ファイル名に日付をつける方法は すでにお分かりかと思います。) 「ここか」と思う関数名を変更してから転送してみて、エラーが出るかどうかでその関数が使用されているか否か確認できます。 その他 WinCacheGrind 等 http://php.y-110.net/wiki/index.php?%A5%D7%A5%ED%A5%D5%A5%A1%A5%A4%A5%EA%A5%F3%A5%B0%A1%A7xdebug%20%2B%20WinCacheGrind

midorinodonchan
質問者

お礼

何度もご丁寧にありがとうございました。 がんばってファイル名を決定している箇所を探してみます。 今後ともよろしくお願いいたします。

  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.3

意図不明の変数は無視するとして、mp_file_mp_file_name()の方は動作するものの、実際の転送/DB書き込みと思われる追加分ではこの関数は使用されていないようですね。 あまりお勧めはしませんが、追加分の // Rename file... $file_name = drupal_substr(~ の箇所を $file_name = date("YMDHis"); とすればどうなりますか? ※本来、関数 mp_file_commit()に送られている $file_path が生成されている箇所を探し出して そこでファイル名を決定しなければならないばすです。もし上記でうまくいっても、どこでどんなバクが出るか分かりません。 力になれず申し訳ありませんが、当該スクリプトのフォーラムあたりで質問した方が的確な回答が得られるかもです。

midorinodonchan
質問者

お礼

$file_name = drupal_substr(~⇒$file_name = date("YMDHis"); のように変更しましたが、特に変化はありませんでした。。。

midorinodonchan
質問者

補足

ご回答ありがとうございます。 ご指示のように変更してみましたが、ダメでした。。。 ※ちなみにフォーラムには質問しているのですが、全く返信がない状態で困っています・・・

  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.1

ざっと見ですが、ファイルが存在する場合はちゃんとリネームするようになっていますよ。ただ当該箇所が、 while( file_exists($dir . $new_file_name)){ となっていますから、引数$dir には"./tmp/"等のようにスラッシュで閉じで渡さないとダメかと。 もしくは while( file_exists("$dir/$new_file_name")){ とするか。

midorinodonchan
質問者

お礼

いつもご回答ありがとうございます。 引き続きよろしくお願いいたします。

midorinodonchan
質問者

補足

ご回答ありがとうございます。 while( file_exists("$dir/$new_file_name")){ に変更してみましたが、やはりファイルは上書きされてしまいました。。。 他に変更する箇所はございますでしょうか?