【问题标题】:How to save file to server after checking for validation with PHP使用 PHP 检查验证后如何将文件保存到服务器
【发布时间】:2012-09-10 02:54:39
【问题描述】:

如果用户上传文件并且内容被这样检索

$file = $_FILES['uploadedFile'];

然后,文件被发送到函数以确保它是可接受的文件类型。如果是,保存在服务器上

function saveInputFile($file){
   if($check->checkFile($file)== TRUE){
      //save $file on my server
   }
   else{
      echo "can't be saved!";
   }
}

假设它通过了 checkFile 函数,那么我如何从 saveInputFile 函数中将此文件保存到我的服务器?我可以将文件设置为一个变量,然后保存该变量还是必须直接从 POST 数据中保存文件?

我已经看到它是这样完成的,但是我已经将文件传递给了这个函数。

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
   echo "The file ".  basename( $_FILES['uploadedfile']['name']). " has been uploaded";
 } else{
    echo "There was an error uploading the file, please try again!";
}

归根结底,我想在以下函数中保存一个文件。我可以像在上面的 saveInputFile 函数中那样将文件像变量一样传递,还是不能像这样工作?

【问题讨论】:

标签: php mysql file-upload


【解决方案1】:

您可以使上传文件成为它自己的类型,它在数据旁边具有所需的方法。这将使使用更加灵活:

$upload = new UploadFile($_FILES['uploadedFile']);
$message = saveInputFile($upload);
echo $message;

function saveInputFile(UploadFile $upload)
{
    if ($check->checkFile($upload->getBasename()) == TRUE) {
        $message = $upload->moveTo($target_path)
            ? sprintf('The file %s has been uploaded', $upload->getBasename())
            : 'There was an error uploading the file, please try again!'
            ;
    } else {
        $message = "can't be saved!";
    }

    return $message;
}

新类型UploadFile 表示$_FILE 数组中的一个文件,它是一个包装文件上传所携带的基本数据和方法的类。下面是一些示例代码:

class UploadFile
{
    protected $file;

    private $filename;

    public function __construct(array $file)
    {
        $this->file = $file;
    }

    public function hasError()
    {
        return $this->getProperty('error') !== UPLOAD_ERR_OK;
    }

    public function getError()
    {
        return $this->getProperty('error');
    }

    public function getBasename()
    {
        return basename($this->getProperty('name'));
    }

    public function getFilename()
    {
        return $this->filename;
    }

    /**
     * @param $newName
     * @return NULL|SplFileInfo
     * @throws BadMethodCallException
     */
    public function moveTo($newName)
    {
        $newName  = (string)$newName;
        $filename = $this->getFilename();

        if ($filename !== NULL) {
            throw new BadMethodCallException(sprintf('Upload file (%s) has been already moved (%s).', $this->getBasename(), $filename));
        }

        $tmpName = $this->getProperty('tmp_name');

        if (move_uploaded_file($tmpName, $newName)) {
            $this->filename = realpath($newName);
        }

        return $this->getFileInfo();
    }

    /**
     * @return SplFileInfo|NULL
     */
    public function getFileInfo()
    {
        $filename = $this->getFilename();

        if ($filename !== NULL) {
            return new SplFileInfo($filename);
        }
    }

    protected function getProperty($name, $default = NULL)
    {
        if (isset($this->file[$name])) {
            return $this->file[$name];
        }

        return $default;
    }
}

随意使用它。另见SplFileInfodocumentation about file uploads in the PHP manual,其中记录了$_FILE 数组和PHP upload error codes (which are important) 的结构。

【讨论】:

  • 谢谢,正是我要找的东西
  • 一个更基本的变体是传递数组,但是数组没有任何类型,它只是一个数组,一个对象可以有一个具体的类型,这很有帮助。很高兴它有帮助,代码没有经过真正的测试,所以我希望这对你有用。此外,如果您使用文件输入元素的数组,这不会开箱即用,因为$_FILES 数组的格式会发生变化。一个好的类应该处理这个问题,您可能希望从它扩展并在此之前保护 getProperty 函数。
【解决方案2】:

您的move_uploaded_file 函数应采用2 个参数,源文件名destination file 名称。

在 PHP 中,文件移动函数称为rename

【讨论】:

  • 我要问的是我是否可以设置一个变量作为文件,然后使用一个函数通过变量将文件保存到服务器。
  • 你写: $file = $_FILES['uploadedFile'];你应该写:$filename = $_FILES['uploadedFile']['tmp_name'];
  • @JvdBerg,根据您的建议设置 $filename 后,我可以在 move_uploaded_file 中使用 $filename 吗?
  • 是的,使用它作为 yoyr 源文件名
猜你喜欢
  • 2013-03-07
  • 2010-11-25
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2013-04-24
相关资源
最近更新 更多