PHP 脚本在第一个文件上传后不起作用
PHP script doesn't work after first file upload
我遇到了一个奇怪的问题,但希望有人知道是怎么回事。
我已经从 git 克隆了项目并开始在 PHPStorm 中使用它,运行 它在我的本地 Apache 服务器中。所以它是第一次工作,但在我的下一次尝试中,脚本没有响应。重新启动 Apache 没有帮助,因为 IDE 中的 re-run 脚本也是如此。浏览器中没有任何信息 console/resources。
我确定这是 headers 和 re-wrote 脚本中的问题:
$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 方法发送数据会导致脚本在第二次运行时崩溃?它看起来像 server-side 或其他地方的循环转发,但没有可见错误,并且在 apache 日志中也是如此。
ADD:看起来与权限有关。第一次,文件上传错误 3 - 文件已部分上传。我试过 chmod 755 -R ./SVG
,没有结果。有人可以帮我解决这个问题吗?
请确保您的文件上传表单具有 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)){
找到答案。
当文件上传到服务器时,apache 尝试将文件放入临时目录,如 /var/tmp
。 www-data
有权在该目录中读写,这就是我卡住的原因。
我的项目不在 /var/www
中,我使用 PhpStorm 工具 运行 它。我想知道,为什么它不起作用 - www-data
组拥有对项目文件夹和临时文件夹的所有权限。但是后来,我在我的脚本中尝试了
echo exec('whoami');
它返回的不是 www-data,而是我的用户名。我只是更改了 /etc/group
文件
www-data:x:33
到
www-data:x:33:myUserName
现在可以使用了。
我遇到了一个奇怪的问题,但希望有人知道是怎么回事。
我已经从 git 克隆了项目并开始在 PHPStorm 中使用它,运行 它在我的本地 Apache 服务器中。所以它是第一次工作,但在我的下一次尝试中,脚本没有响应。重新启动 Apache 没有帮助,因为 IDE 中的 re-run 脚本也是如此。浏览器中没有任何信息 console/resources。
我确定这是 headers 和 re-wrote 脚本中的问题:
$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 方法发送数据会导致脚本在第二次运行时崩溃?它看起来像 server-side 或其他地方的循环转发,但没有可见错误,并且在 apache 日志中也是如此。
ADD:看起来与权限有关。第一次,文件上传错误 3 - 文件已部分上传。我试过 chmod 755 -R ./SVG
,没有结果。有人可以帮我解决这个问题吗?
请确保您的文件上传表单具有 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)){
找到答案。
当文件上传到服务器时,apache 尝试将文件放入临时目录,如 /var/tmp
。 www-data
有权在该目录中读写,这就是我卡住的原因。
我的项目不在 /var/www
中,我使用 PhpStorm 工具 运行 它。我想知道,为什么它不起作用 - www-data
组拥有对项目文件夹和临时文件夹的所有权限。但是后来,我在我的脚本中尝试了
echo exec('whoami');
它返回的不是 www-data,而是我的用户名。我只是更改了 /etc/group
文件
www-data:x:33
到
www-data:x:33:myUserName
现在可以使用了。