2016-05-10 5 views
0

イメージファイルを自分のWebサーバーにアップロードするupload_file.phpという名前のファイルがあります。私が抱えている問題は、アップロードプロセス中にファイル名のすべてのスペースをアンダースコアに置き換えたいということです。私はこれがstr_replace()を使って行うことができることを知っていますが、私はどこで私のコード内でstr_replace()を使うべきかわかりません。どんな助けでも大歓迎です。アップロードプロセス中にファイル名のすべてのスペースをアンダースコアに置き換えます。

<?php 
require_once '../../config.php'; 
include '../secure.php'; 
if ($login_status != 1) exit(); 
if (isset($_GET['done'])) { 
    if ($_FILES["file"]["error"] > 0) { 
     echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; 
    } 
    else { 
     if ($_POST['type'] == 'wallpaper') { 
      $directory = "../../files/"; 
     } 
     else { 
      $directory = "../../files/images/"; 
     } 

     $filename = basename($_FILES['file']['name']); 
     $ext = substr($filename, strrpos($filename, '.') + 1); 

     if (file_exists($directory . $_FILES["file"]["name"])) { 
      echo htmlspecialchars($_FILES["file"]["name"]) . " already exists. "; 
     } 
     elseif (((strpos($ext, "php") !== false) || $ext == 'aspx' || $ext == 'py' || $ext == 'htaccess') && !isset($allow_php_uploads)) { 
      echo 'Uploading PHP files disabled (<a target="_blank" href=""></a>)'; 
     } 
     else { 
      move_uploaded_file($_FILES["file"]["tmp_name"], $directory . $_FILES["file"]["name"]); 
      header("Location: upload-complete.php?type=".htmlspecialchars($_POST['type'])."&newfile=". htmlspecialchars($_FILES["file"]["name"])."&id=".intval($_POST['id']).""); 
     } 
    } 
} else { ?> 

<head> 
<style type="text/css"> 
body { 
    margin:0px; 
    padding:0px; 
} 
</style> 
</head> 

<form action="upload_file.php?done=1" method="post" 
enctype="multipart/form-data"> 
    <input type="file" name="file" id="file" style="max-width:230px;" /> 
    <input name="id" type="hidden" value="<?php echo intval($_GET['id']);?>" /> 
    <input name="type" type="hidden" value="<?php echo htmlspecialchars($_GET['type']);?>" /> 
    <input type="submit" name="submit" value="Upload" /> 
</form> 
<?php } ?> 

答えて

0

あなたは、ファイルの名前を保持する変数を作成し、そこにすべてのスペースを置き換えることができます:

は、ここに私のupload_file.phpファイル内に含まれる完全なコードです。その後、残りのコードでは、$_FILES["file"]["name"]をその変数で置き換えます。

<?php 
require_once '../../config.php'; 
include '../secure.php'; 
if ($login_status != 1) exit(); 
if (isset($_GET['done'])) { 
    if ($_FILES["file"]["error"] > 0) { 
     echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; 
    } 
    else { 
     if ($_POST['type'] == 'wallpaper') { 
      $directory = "../../files/"; 
     } 
     else { 
      $directory = "../../files/images/"; 
     } 

     $filename = basename($_FILES['file']['name']); 
     $file = preg_replace('/\s+/', '_', $_FILES['file']['name']); // <-- Replace spaces 
     $ext = substr($filename, strrpos($filename, '.') + 1); 

     if (file_exists($directory . $file)) { 
      echo htmlspecialchars($file) . " already exists. "; 
     } 
     elseif (((strpos($ext, "php") !== false) || $ext == 'aspx' || $ext == 'py' || $ext == 'htaccess') && !isset($allow_php_uploads)) { 
      echo 'Uploading PHP files disabled (<a target="_blank" href=""></a>)'; 
     } 
     else { 
      move_uploaded_file($_FILES["file"]["tmp_name"], $directory . $file); 
      header("Location: upload-complete.php?type=".htmlspecialchars($_POST['type'])."&newfile=". htmlspecialchars($file)."&id=".intval($_POST['id']).""); 
     } 
    } 
} else { ?> 

<head> 
<style type="text/css"> 
body { 
    margin:0px; 
    padding:0px; 
} 
</style> 
</head> 

<form action="upload_file.php?done=1" method="post" 
enctype="multipart/form-data"> 
    <input type="file" name="file" id="file" style="max-width:230px;" /> 
    <input name="id" type="hidden" value="<?php echo intval($_GET['id']);?>" /> 
    <input name="type" type="hidden" value="<?php echo htmlspecialchars($_GET['type']);?>" /> 
    <input type="submit" name="submit" value="Upload" /> 
</form> 
<?php } ?> 
+0

優れた答えです。あなたのコードは完全に機能します。ありがとうございました。私は次のコードを変更しましたが、$ file = preg_replace( '/ \ s + /'、 '_'、$ _FILES ['file'] ['name']); $ file = str_replace( ""、 "_"、$ _FILES ['file'] ['name']); – 1Ton

+0

私は最初の返信で、両方のコードで一重引用符と二重引用符の間のアンダースコアをタイプしたことがstackoverflowによって自動的に削除されていることに気付きました。 – 1Ton

0

スペースをアンダースコアに置き換えるには、ホワイトリストと置換機能を使用する必要があります。だからあなたは次のようなことができます:

私はそれをテストすることはできませんが、そのようなものはうまくいくはずです。基本的には、[[^-a-z0-9] +/i "のホワイトリストにない文字を置き換えます。

関連する問題