gpt4 book ai didi

php - 如何在 PHP 中扫描

转载 作者:IT王子 更新时间:2023-10-29 00:14:27 30 4
gpt4 key购买 nike

我想从我的 PHP 脚本中扫描。我使用的是 Ubuntu 14.04 LTS、一台 Brother MFC-7840W 扫描仪(位于公司)和一台 Brother MFC-9840CDW(位于家中)。当任一扫描仪作为网络扫描仪连接到计算机时,我可以从终端和 PHP 进行扫描。但是,当任一扫描仪作为 USB 扫描仪连接到计算机时,我无法从 PHP 扫描(我仍然可以从终端扫描)。

为什么我的 PHP 脚本无法访问 USB 扫描仪但 $USER 可以?

我在工作时开始提出这个问题,但现在我在家,所以我将展示我尝试从我的 PHP 脚本访问 Brother MFC-9840CDW USB 扫描仪的尝试。

这是我用来扫描的 PHP 代码片段:

if($_POST['ScanDevice'] == "brother3:net1;dev0") // if MFC-7840W network scanner
{$scanner = escapeshellarg($_POST['ScanDevice']);}
elseif($_POST['ScanDevice'] == "brother3:bus3;dev1") // if MFC-7840W USB scanner
{$scanner = escapeshellarg($_POST['ScanDevice']);}
elseif($_POST['ScanDevice'] == "brother3:net1;dev1") // if MFC-9840CDW network scanner
{$scanner = escapeshellarg($_POST['ScanDevice']);}
elseif($_POST['ScanDevice'] == "brother3:bus6;dev1") // if MFC-9840CDW USB scanner
{$scanner = escapeshellarg($_POST['ScanDevice']);}

$command = "scanimage -d {$scanner} --resolution {$_POST[ScanResolution]} --mode {$_POST[ScanColor]} > {$filename}";

echo exec($command,$op,$result);
if($result > 0)
{die("ERROR");}

PHP 脚本适用于网络扫描仪,但不适用于 USB 扫描仪。
如果我选择任一 USB 扫描仪(当前为 MFC-9840CDW)并运行脚本,则文件/var/log/apache2/error.log 显示:

scanimage: open of device brother3:bus6;dev1 failed: Invalid argument  

问题来了:设备brother3:bus6;dev1是否存在?

这是在家里的终端(MFC-9840CDW 所在的位置)输入时 scanimage --list-devices 显示的内容:

[pixma] udp_command: No data received (select): timed out
[pixma] udp_command: No data received (select): timed out
[pixma] udp_command: No data received (select): timed out
[pixma] Cannot read scanner make & model: �+�&
device `brother3:net1;dev1' is a Brother MFC-7840W SCANNER
device `brother3:net1;dev0' is a Brother MFC-9840CDW Scanner-MFC-9840CDW
device `brother3:bus6;dev1' is a Brother MFC-9840CDW USB scanner

为了演示 USB 扫描仪可以为 $USER 工作,我在终端中输入以下命令:

scanimage --test -d 'brother3:bus6;dev1'  

显示:

scanimage: rounded value of br-x from 215.9 to 215.88
scanimage: rounded value of br-y from 355.6 to 355.567
scanimage: scanning image of size 1664x2776 pixels at 24 bits/pixel
scanimage: acquiring RGB frame, 8 bits/sample
scanimage: reading one scanline, 4992 bytes... PASS
scanimage: reading one byte... PASS
scanimage: stepped read, 2 bytes... PASS
scanimage: stepped read, 4 bytes... PASS

为了演示用户 www-data 无法访问 USB 扫描仪,我在终端中输入以下命令:

sudo -u www-data scanimage --test -d 'brother3:bus6;dev1'  

显示:

scanimage: open of device brother3:bus6;dev1 failed: Invalid argument

最佳答案

PHP 无法访问 USB 扫描仪,因为 www-data(运行 PHP 脚本的用户)不是 USB 扫描仪所属组的成员。将用户 www-data 添加到 USB 扫描仪所属的组。

要找到 USB 扫描仪所属的组,必须知道 USB 扫描仪的名称。要查找 USB 扫描仪的名称,请输入命令:

lsusb -v  

显示(除其他行外):

Bus 002 Device 007: ID 04f9:01cc Brother Industries, Ltd  

然后,输入命令找到USB扫描器所属的组:

ls -al /dev/bus/usb/002/007  

显示:

crw-rw-r--+ 1 root lp 189, 134 Dec 12 22:30 /dev/bus/usb/002/007  

USB 扫描仪所属的组是lp。 $USER 能够访问 USB 扫描仪的原因是因为 $USER 是 lp 组的成员,而 www-data 不是。这通过输入命令来演示:

grep ^lp /etc/group  

显示:

lp:x:7:root,arya  

通过输入以下命令将用户 www-data 添加到组 lp:

sudo usermod -a -G lp www-data  

然后,再次测试结果,输入 grep ^lp/etc/group,现在显示:

lp:x:7:root,arya,www-data  

然后,重新启动 apache 以确保注册了上述操作:

sudo apache2ctl -k restart  

然后测试 www-data 是否可以从终端访问 USB 扫描器:

sudo -u www-data scanimage --test -d 'brother3:bus6;dev1'  

显示:

scanimage: rounded value of br-x from 215.9 to 215.88  
scanimage: rounded value of br-y from 355.6 to 355.567
scanimage: scanning image of size 1664x2776 pixels at 24 bits/pixel
scanimage: acquiring RGB frame, 8 bits/sample
scanimage: reading one scanline, 4992 bytes... PASS
scanimage: reading one byte... PASS
scanimage: stepped read, 2 bytes... PASS
scanimage: stepped read, 4 bytes... PASS

然后,再次运行原始 PHP 脚本,看看它是否可以访问 USB 扫描仪并扫描文档...

成功!

关于php - 如何在 PHP 中扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27434438/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com