我有一个网络表单来上传用户的图片。 然后我创建一个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应用程序中完美加载的方式更改用户提供的文件名,并且可能包含空格和/或特殊字符?
答案 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);
}