如何避免使用空格和/或特殊字符的文件名

时间:2014-02-24 05:15:06

标签: php ios

我有一个网络表单来上传用户的图片。 然后我创建一个iOS应用程序来显示从用户加载的图片。但如果文件名包含空格或特殊字符(如á,é,í,ó,ú,ñ等),应用程序不会加载图片,大多数用户来自西班牙......

这是我正在使用的代码:

<?php if ((isset($_POST["enviado"])) && ($_POST["enviado"] == "form1")) {
    $randomString = substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1) . substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10);

echo $randomString;
    $nombre_archivo = $_FILES['userfile']['name']; 
    move_uploaded_file($_FILES['userfile']['tmp_name'], "logos/".$randomString.$nombre_archivo);

    ?>

我使用随机函数来避免重复的文件名。

我怎么能以一种可以在iOS应用程序中完美加载的方式更改用户提供的文件名,并且可能包含空格和/或特殊字符?

3 个答案:

答案 0 :(得分:1)

这是你需要做的。 1)生成基于唯一id的文件名字符串。 2)使用新生成的文件名重命名文件。

<?php
    rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt");
?>

答案 1 :(得分:1)

如果您确实希望将用户输入的字符串保留为文件名的一部分,则可以执行类似这样的操作,将UTF-8字符音译为其ASCII等效字符(如果可能),然后删除任何非ASCII和无效字符:

function get_file_name($string) {
    // Transliterate non-ascii characters to ascii
    $str = trim(strtolower($string));
    $str = iconv('UTF-8', 'ASCII//TRANSLIT', $str);

    // Do other search and replace
    $searches = array(' ', '&', '/');
    $replaces = array('-', 'and', '-');
    $str = str_replace($searches, $replaces, $str);

    // Make sure we don't have more than one dash together because that's ugly
    $str = preg_replace("/(-{2,})/", "-", $str );

    // Remove all invalid characters
    $str = preg_replace("/[^A-Za-z0-9-]/", "", $str );

    // Done!
    return $str;
}

您可以尝试将此功能与文件的唯一ID结合使用,这样,如果两个用户上传的文件名相同,则不会发生冲突。

答案 2 :(得分:1)

上传后重命名文件。这是评论中OP问题的答案

// get the uploaded file's temp filename
$tmp_filename = $_FILES['userfile']['tmp_name'];

// get the file's extension
$path = $_FILES['userfile']['name'];
$ext = pathinfo($path, PATHINFO_EXTENSION);

// rename the uploaded file with a timestamp, insert the destination directory and add the extension
$new_filename = 'logos/'.date('Ymdhms').'.'.$ext;

// put the renamed file in the destination directory
move_uploaded_file($tmp_filename, $new_filename);

编辑:每个OP问题的新答案

<?php
     if((isset($_POST["enviado"])) && ($_POST["enviado"] == "form1")) {
        // get the uploaded file's temp filename
        $tmp_filename = $_FILES['userfile']['tmp_name'];

        // get the file's extension
        $path = $_FILES['userfile']['name'];
        $ext = pathinfo($path, PATHINFO_EXTENSION);

        // rename the uploaded with a timestamp file, add the extension and assign the directory
        $new_filename = 'logos/'.date('Ymdhms').'.'.$ext;

        // put the renamed file in the destination directory
        move_uploaded_file($tmp_filename, $new_filename);
    }