用Python保存图形并用PHP显示

0 投票
1 回答
768 浏览
提问于 2025-04-17 22:23

我正在尝试在本地服务器上使用一个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 个回答

0

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 脚本的?是通过命令行,还是通过网络服务器?记住,这两种方式是完全不同的环境,拥有不同的 uidgid。在网络服务器下执行的 Python 脚本可能没有权限去写那个文件,而当你在命令行下自己运行时,它是以你的身份在运行的,所以就有权限了。

撰写回答