【问题标题】:PHP script doesn't work after first file upload第一次文件上传后PHP脚本不起作用
【发布时间】:2015-01-18 22:53:14
【问题描述】:

我遇到了一个奇怪的问题,但希望有人知道这是怎么回事。

我已经从git 克隆了项目并开始在 PHPStorm 中使用它,并在我的本地 Apache 服务器上运行它。所以它第一次工作,但在我的下一次尝试中,脚本没有响应。重新启动 Apache 并没有帮助,因为在 IDE 中也重新运行脚本。浏览器控制台/资源中没有任何信息。

我已经确定这是标题中的问题,并重新编写了脚本:

$fileInputName = 'uploadedFile';
if ( !array_key_exists( $fileInputName, $_FILES ) ) {
    echo ('there are no files to work with');
    die();
}
$uploadName = $_FILES[$fileInputName]['tmp_name'];
$size = $_FILES[$fileInputName]['size'];
$pathToSaveSVG = realpath(dirname(__FILE__)) . '/SVG';

$fileName = $uploadName . '.pdf';
$targetName = $fileName . '.svg';

if ( !move_uploaded_file( $uploadName, $fileName ) ) {
    echo ($uploadName. '    '. $fileName);
    unlink( $uploadName );
    echo( 'can\'t move uploaded file' );
    die();
}

exec( 'pdf2svg ' . escapeshellarg( $fileName ) . ' ' . escapeshellarg( $pathToSaveSVG. '/' . $targetName ) );
unlink($fileName);

echo $pathToSaveSVG . '/' . $targetName;
die;

html:

<form action="pdf_to_svg.php" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
    <input type="file" name="uploadedFile" id="file" accept="application/pdf" />
    <input type="submit" name="submit" value="Convert " />
</form>

然后,它重复。如果我只是按名称转换文件,而不是通过 POST 数据发送,脚本就可以正常工作。

请提供任何提示,为什么通过 POST 方法发送数据会在第二次工作时使脚本崩溃?它看起来像服务器端的循环转发或其他东西,但没有明显的错误,而且在 apache 日志中也是如此。

添加:看起来它与权限有关。第一次,文件上传错误 3 - 文件已部分上传。我试过chmod 755 -R ./SVG,没有结果。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您是否查看了浏览器的网络工具并看到了一些不寻常的东西(例如浏览器在脚本执行最大后仍在等待响应)? PS:echo 是一种语言构造不是函数,因此您应该删除括号()。
  • 也使用 shell_exec() 而不是 exec() 并捕获响应。通过 SSH 连接到服务器并使用top 查看 pdf2svg 是否开始运行。
  • @CharlotteDunois 谢谢,所以我不是 php 开发人员,但稍后会修复这些问题。浏览器只写“等待本地主机...”,但工具中绝对没有信息。

标签: php apache localhost


【解决方案1】:

确保您的文件上传表单具有属性enctype="multipart/form-data"
否则文件上传可能无法正常工作。

确保将 memory_limit 设置得足够大。

确保将 max_execution_time 设置得足够大。

确保将 post_max_size 设置得足够大。

检查核心价值观:

phpinfo(); 

确认上传没有错误并且内容 MIME 类型正确

if( is_uploaded_file($_FILES['uploadedFile']['tmp_name']) || !($_FILES['uploadedFile']['error'] !== UPLOAD_ERR_OK) && strtolower($_FILES['uploadedFile']['type']) == 'application/pdf' )){

获取exec的返回状态:

$status = exec(...);
echo "<p>$status</p>";

确保目标路径和文件名正确。

if (file_exists($fileName ) && file_exists($pathToSaveSVG)){

【讨论】:

  • 正如我几分钟前提到的,它的代码 3 有错误。第一次,它没有 'tmp_name' 键,并且 'size' 等于 0。我已经像这样更改了 apache 权限:stackoverflow.com/questions/8457683/…,但还是不行。
  • @realvladi 如果 www-data(运行网络服务器的用户)不是目录的所有者,则目录需要 766 的 chmod。en.wikipedia.org/wiki/File_system_permissions#Numeric_notation
  • 使用phpinfo() 检查内存、最大文件大小、执行时间。检查Content Type multipart/form-data的响应头
【解决方案2】:

找到了答案。 当文件上传到服务器时,apache 会尝试将文件放入临时目录,例如 /var/tmpwww-data 有权在该目录中读写,这就是我被卡住的原因。 我的项目不在 /var/www 中,我使用 PhpStorm 工具运行它。我想知道,为什么它不起作用 - www-data 组拥有项目文件夹和临时文件夹的所有权限。但是后来,我在我的脚本中尝试了

echo exec('whoami');

它返回的不是 www-data,而是我的用户名。我只是更改了/etc/group 文件

www-data:x:33

www-data:x:33:myUserName

现在它可以工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多