用Python保存图形并用PHP显示
我正在尝试在本地服务器上使用一个PHP脚本来绘制一些数学过程的结果,但遇到了一些问题。
我的想法是先用PHP上传一个文本文件;把它保存在一个文件夹里;然后用Python处理这个文件,并把生成的图像保存在同一个文件夹里;最后再用PHP显示这个保存的图像。
有没有人能帮我一下?
1) 数据是通过PHP上传的,使用了以下代码:
<?php
define("UPLOAD_DIR",realpath(dirname(__FILE__)).'/uploads/' );
$name = $_FILES['myFile']['name'];
chmod(realpath(dirname(__DIR__)).'/uploads', 0755);
chmod(realpath(dirname(__DIR__)).'/uploads/'.$name, 0755);
$success = move_uploaded_file($myFile["tmp_name"],
UPLOAD_DIR . $name);
?>
然后我收到了这个提示:
警告:chmod(): 没有这样的文件或目录,在 /opt/lampp/htdocs/myPhpScripts/upload1.php 的第7行,文件没有被保存。
2) 我想用Python做一些信号处理,并用PHP显示保存的图片。
>>> #!/usr/bin/env python
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x = np.random.randn(100)
>>> y = np.fft.fft(y)
>>> plt.plot(y)
>>> plt.savefig('test.png')
然后我编译了我的Python脚本。
$sudo chmod +x myFft.py
当我在终端运行Python代码时,它会把test.png保存在当前文件夹:
$./myFft.py
但当我用下面的方式调用这个脚本时:
<?php
$omega = system('./myFft.py');
?>
什么也没发生。
所以我把我的Python脚本改成了:
>>> #!/usr/bin/env python
>>> import numpy as np
>>> x = np.random.randn(100)
>>> y = np.fft.fft(x)
>>> print y
我又一次编译了这个Python脚本。
$sudo chmod +x myFft.py
现在我可以用下面的代码把fft结果存储到一个PHP变量里:
<?php
$omega = system('./myFft.py', $pyVal);
?>
这个$pyVAl变量存储了fft的结果。
为什么我在终端运行Python脚本时可以保存图像,但在PHP脚本中却不行呢?
提前谢谢大家!
1 个回答
1) 你正在尝试修改一个还不存在的文件的权限:
chmod(realpath(dirname(__DIR__)).'/uploads/'.$name, 0755);
^^^^^--- you haven't moved the upload yet
move_uploaded_file(...);
正确的顺序应该是
move_uploaded_file(...);
chmod(...);
另外,直接使用 ['name']
这个参数会让你的系统面临被远程攻击的风险。因为 ['name']
是用户提供的数据,可能包含路径信息。如果有人恶意修改上传的内容,比如说 ../../../../../etc/passwd
,那么你的系统就会受到严重威胁。
2) 你是如何运行这个 PHP 脚本的?是通过命令行,还是通过网络服务器?记住,这两种方式是完全不同的环境,拥有不同的 uid
和 gid
。在网络服务器下执行的 Python 脚本可能没有权限去写那个文件,而当你在命令行下自己运行时,它是以你的身份在运行的,所以就有权限了。