【问题标题】:file upload from iPhone to PHP not worked文件从 iPhone 上传到 PHP 不起作用
【发布时间】:2011-09-17 10:01:15
【问题描述】:

从 iPhone 上传文件时,我的代码产生以下错误:

警告:move_uploaded_file() 无法将“/tmp/phpUcqFVq”移动到 /var/www/ds1134/https 中的“/var/www/ds1134/http.www.xxx.com/app/1316254141147.jpg”。 www.xxx.com/user.php 第 2866 行

$_FILES 看起来像:

 [file] => Array
 (
    [name]     => 1316250632283.jpg
    [type]     => 
    [tmp_name] => /tmp/phpFio7gb
    [error]    => 0
    [size]     => 35515
 )

我上传的PHP代码是:

if (move_uploaded_file($_FILES["file"]["tmp_name"], "/var/www/ds1134/http.www.xxx.com/app/".$_FILES["file"]["name"]))
{
    echo "done";
}

【问题讨论】:

  • 上传看起来不错。您是否开启了错误报告?
  • 附注,未经检查使用用户提供的文件名是危险的
  • 不,不开启错误报告
  • 为什么不打开它,看看有什么问题?
  • 所以警告给了你答案,不是吗?

标签: php iphone


【解决方案1】:

您可以添加一些前置条件检查来找出无法写入文件的原因:

$tmpName = $_FILES["file"]["tmp_name"];
$destDir = "/var/www/ds1134/http.www.xxx.com/app";
$destName = $destDir.$_FILES["file"]["name"];

if (!is_directory($destDir)
{
    throw new Exception('Destination is not a directory.');
}

if (!is_writable($destDir))
{
    throw new Exception('Destination directory is not writable.');
}

if (!preg_match('/^\d{13}\.jpg$/', $destName)
{
    throw new Exception('Invalid destination filename given. Only accepting 13 digits plus ".jpg".');
}

$destination = $destDir.'/'.$destName;

if (is_file($destination))
{
    throw new Exception('Destination filename already exists.');
}

if (virus_found($tmpName))
{
    throw new Exception('Upload file contains a virus.');
}

if (!imagecheck_validate_jpg($tmpName, 'color,24bit,size<1mb,in300x300,browser-compatible'))
{
    throw new Exception('Uploaded file does not meet the image requirements.');
}

if (move_uploaded_file($tmpName, $destination))
{
    echo "done";
}
else
{
    throw new Exception('Unable to move file.');
}

【讨论】:

  • 这仍然很危险,因为它会盲目地接受用户提供的文件名。
  • 不错的解决方案(如果格式始终相同!但如果不是,OP 无论如何都需要定义命名方案。)
  • 添加了一些健全性检查。当然,这些取决于我无法提供的具体实现。
猜你喜欢
  • 2015-02-11
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 2016-03-11
相关资源
最近更新 更多