2016-05-10 36 views
0

我有一个名为upload_file.php的文件,它将图像文件上传到我的Web服务器。我遇到的问题是我想在上传过程中用文件名中的下划线替换文件名中的所有空格。我知道这可以使用str_replace()来完成,但我不知道应该在我的代码中使用str_replace()。任何帮助将不胜感激。上传过程中用下划线替换文件名中的所有空格

这里是包含我upload_file.php文件中的全部代码:

<?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

您可以创建包含文件名的变量替换所有的空间存在。然后在代码的其余部分中,用该变量替换$_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']); to:$ file = str_replace(“”,“_”,$ _FILES ['file'] ['name']); – 1Ton

+0

我刚刚在我的第一个回复中注意到,在这两个代码中,我在单引号和双引号之间键入了下划线,并由stackoverflow自动删除。 – 1Ton

0

您必须尝试用白名单和替换函数替换带下划线的空格。所以你可以做这样的事情:

$file = preg_replace("/[^-_a-z0-9]+/i", "_", $file); 

我现在无法测试,但类似的东西应该可以正常工作。基本上,它取代了他们不在“[^ -_ a-z0-9] +/i”的白名单中的字符。

相关问题