laravel 从文件名中删除特殊字符

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/33511235/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 12:37:53  来源:igfitidea点击:

Removing special characters from filename

phpimagelaraveluploadspecial-characters

提问by Eieur Geir Vilhelmsson

I'm making a website where people can upload images. However when end-users are uploading an image that contains special characters or a foreign character, the image does upload, But It cannot be display'd on the website, Like the image doesn't exist on the server.

我正在制作一个人们可以上传图片的网站。但是当最终用户上传包含特殊字符或外来字符的图片时,图片确实上传了,但无法在网站上显示,就像该图片在服务器上不存在一样。

I see a lot of people answering on another post saying that I need to use preg_replace

我看到很多人在另一个帖子上回答说我需要使用 preg_replace

But the thing is, I don't really know how to use it. How would I use it in my code.

但问题是,我真的不知道如何使用它。我将如何在我的代码中使用它。

Here is my controller method:

这是我的控制器方法:

public function upload(Requests\CreatePostsRequest $request)
{
        $target_dir = "uploads/";
        $target_file = $target_dir . basename($_FILES['fileToUpload']["name"]);
        $uploadOk = 1;
        $findme   = ".";
        $pos = strpos($target_file, $findme);
        //echo $target_file;
        //dd($_POST);
        echo ini_get('upload_max_filesize');
        echo $_FILES["fileToUpload"]["error"];
        $imageFileType = strtolower(substr($target_file,$pos+1));
        if(isset($_POST["submit"])) {
            $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
                //$check = true;
                //dd($check);
            if($check !== false) {
                echo "File is an image - " . $check["mime"] . ".";
                $uploadOk = 1;
            } else {
                echo "File is not an image.";
                $uploadOk = 0;
            }
        }
        $filecheck = 0;
        $orgFileName = $target_file;
        while (file_exists($target_file)) {
            $target_file = substr($orgFileName,0,$pos).$filecheck.substr($orgFileName,$pos);
            $filecheck++;

            $uploadOk = 1;
        }

        if ($_FILES["fileToUpload"]["size"] > 500000000*8) {
            echo "Sorry, your file is too large.";
            $uploadOk = 0;
        }

        if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
        && $imageFileType != "gif" ) {
            echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
                echo $imageFileType;
            $uploadOk = 0;
        }

        if ($uploadOk == 0) {
            echo "Sorry, your file was not uploaded.";

        } else {
            if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
                echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";

                        $post = new Posts($request->all());
                        $post->fileToUpload = $target_file;
                        Auth::user()->posts()->save($post);
            } else {
                echo "Sorry, there was an error uploading your file.";
            }
        }
        return redirect('');
        echo $target_file;
    }

回答by Magnus Eriksson

Using preg replace:

使用 preg 替换:

$target_file = $target_dir . preg_replace("/[^a-z0-9\_\-\.]/i", '', basename($_FILES['fileToUpload']["name"]));

This will remove all characters that's not a letter (a-z), a number (0-9) or a dash, underscore or dot (we want to keep the file extension). The iflag in the end makes the match case insensitive.

这将删除所有不是字母 (az)、数字 (0-9) 或破折号、下划线或点(我们希望保留文件扩展名)的字符。最后的i标志使匹配不区分大小写。

Update

更新

To make the expression shorter, you can replace a-z0-9\_-part with the word token \w.
The pattern would then be: /[^\w\-\.]/. Here we don't need the iflag, since the word token handles that for us.

为了使表达式更短,您可以将a-z0-9\_-part替换为单词 token \w
模式将是:/[^\w\-\.]/。这里我们不需要i标志,因为单词 token 为我们处理了这个问题。