-PR-
解決済み

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

  • すぐに回答を!
  • 質問No.7026649
  • 閲覧数395
  • ありがとう数4
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 97% (101/104)

PHPに関して素人なため、なかなか理解できず困っています。
どうかお助けください。。。

drupalというオープンソースを利用してECサイトを構築しているのですが、
画像ファイル等をアップロードすると同じ名前のファイルが既に存在していた場合、
ファイルが上書きされてしまいます。

上書きはしたくないため、対処としてアップロードした際に
ファイル名に日付と時間をつけたいと考えています。(過去ログ参照しました)

ファイルのアップロードにはubercart_marketplaceというモジュールを利用していて、
同じ名前のファイルが存在していた際のファイル名に関する挙動は
ubercart_marketplaceモジュールのフォルダの中にあるmp_file.moduleに記述されていると思います。

mp_file.moduleの中に下記のようなコードがあるのですが、
おそらくここが同じ名前のファイルが存在していた際のファイル名に関する
挙動について書かれていると考えています。

この中に.date("YMDHis")を追記すればファイル名に日付が付与されると
思うのですが、PHP初心者でコードがいまいち理解できず、どこに追記すればいいか
わからず困っています。。。

どのように追記すれば良いかご教授いただきたく存じます。
これだけでは情報が不足している場合はその旨ご指摘いただけると幸いです。
PHPが解る方、どうかよろしくお願いいたします。


[環境]
drupalのバージョン:6.x
ファイルアップロードに利用しているモジュール:ubercart_marketplace

[ソースコード]
-----------------
/**
* Implements hook_mp_file_name().
*
* Returns the filename to be used for this feature.
*/
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 . "." . $file_name_ext;

// We could now return $new_file_name but first let's rename it if this file name already exists.
// NB: $file_name also has a counter in it for files in the temp directory
$i_file = 0;
while (file_exists($dir . $new_file_name)) {
$i_file++;
$new_file_name = $node_id . "_" . $file_name . "_" . sprintf("%03d", $i_file) . "." . $file_name_ext;
}

return $new_file_name;
}
-----------------

※ソースの変更はライセンス的にはOKであると確認済です。
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル12

ベストアンサー率 75% (263/350)

申し訳ない。ファイル名に日付と時間をつけたいのでしたね。
それでしたら、上が
$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

お礼率 97% (101/104)

ご回答ありがとうございます!
ご指摘の通り、以下のように変更してみましたが、やはり日付と時間はついてくれませんでした。。。

--------------
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;
}
--------------
投稿日時 - 2011-09-24 12:36:51
お礼コメント
midorinodonchan

お礼率 97% (101/104)

いつもご回答ありがとうございます。
引き続きよろしくお願いいたします。
投稿日時 - 2011-09-25 03:36:43

その他の回答 (全3件)

  • 回答No.4
レベル12

ベストアンサー率 75% (263/350)

ファイル名を決定している箇所がわからなければお手上げです。
何とかその箇所を見つけるしかありません。(ファイル名に日付をつける方法は すでにお分かりかと思います。)

「ここか」と思う関数名を変更してから転送してみて、エラーが出るかどうかでその関数が使用されているか否か確認できます。
その他 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

お礼率 97% (101/104)

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

今後ともよろしくお願いいたします。
投稿日時 - 2011-09-26 22:04:47


  • 回答No.1
レベル12

ベストアンサー率 75% (263/350)

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

もしくは
while( file_exists("$dir/$new_file_name")){
とするか。
補足コメント
midorinodonchan

お礼率 97% (101/104)

ご回答ありがとうございます。
while( file_exists("$dir/$new_file_name")){
に変更してみましたが、やはりファイルは上書きされてしまいました。。。
他に変更する箇所はございますでしょうか?
投稿日時 - 2011-09-23 06:15:19
お礼コメント
midorinodonchan

お礼率 97% (101/104)

いつもご回答ありがとうございます。
引き続きよろしくお願いいたします。
投稿日時 - 2011-09-25 03:36:18
  • 回答No.3
レベル12

ベストアンサー率 75% (263/350)

意図不明の変数は無視するとして、mp_file_mp_file_name()の方は動作するものの、実際の転送/DB書き込みと思われる追加分ではこの関数は使用されていないようですね。

あまりお勧めはしませんが、追加分の
// Rename file...
$file_name = drupal_substr(~
の箇所を
$file_name = date("YMDHis");
とすればどうなりますか?

※本来、関数 mp_file_commit()に送られている $file_path が生成されている箇所を探し出して そこでファイル名を決定しなければならないばすです。もし上記でうまくいっても、どこでどんなバクが出るか分かりません。
力になれず申し訳ありませんが、当該スクリプトのフォーラムあたりで質問した方が的確な回答が得られるかもです。
補足コメント
midorinodonchan

お礼率 97% (101/104)

ご回答ありがとうございます。
ご指示のように変更してみましたが、ダメでした。。。

※ちなみにフォーラムには質問しているのですが、全く返信がない状態で困っています・・・
投稿日時 - 2011-09-25 15:43:28
お礼コメント
midorinodonchan

お礼率 97% (101/104)

$file_name = drupal_substr(~⇒$file_name = date("YMDHis");
のように変更しましたが、特に変化はありませんでした。。。
投稿日時 - 2011-09-25 15:45:24
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-

特集


抽選で合計100名様にプレゼント!

ピックアップ

ページ先頭へ