替换服务器上的图像并显示上一个图像,直到完全上载新图像

时间:2018-04-07 18:46:25

标签: php image ftp upload webserver

我通过" ncftpput"上传到一个光速服务器每分钟从树莓相机拍摄的图像。

我希望能够显示更新的图像,我知道如何强制浏览器使用最新版本而不是缓存图像。

因此,一切正常,但如果我在图像上传期间刷新图像(如通过shift-F5) ,则浏览器报告图像包含错误(或部分显示图像)。

在提供新图像之前,有没有办法确保图像完全加载? 我不确定我是应该在ncftp上运行还是使用PHP来确保只在完全加载后才进行交换。

图片是一个进步的jpg,但这并没有帮助...... 有什么建议吗? 感谢

2 个答案:

答案 0 :(得分:2)

我最终没有使用FTP,因为正如Viney所说,网络服务器不知道上传是否已经完成。

我正在使用“curl”,它具有预先安装在raspberry发行版和php上传页面上的优势。

似乎PHP只会在完全上传后传递新图像,并避免在图像部分上传时出现问题。

所以,回顾一下:

raspberry(网络摄像头),拍完照片后:

curl -F"somepostparam=abcd"  -F"operation=upload" -F"file=@filename.jpg" https://www.myserver.com/upload.php

PHP服务器代码:

$uploadfile = '/home/domain/myserver.com/' . basename($_FILES['file']['name']);
move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile);
$content = file_get_contents($uploadfile);

答案 1 :(得分:1)

问题是这样的:你打开浏览器(上午07:00:10)image.jpg呈现现在说它是07:01:00你在浏览器中点击刷新但是树莓已经开始上传{{1} }说它需要3秒才能完成完整上传,但是服务器不知道ftp并且会读取image.jpg中的任何字节并刷新到浏览器。如果它是一个基线JPG,它会显示一个裁剪(高度)的图像,但由于它是一个渐进的JPG,它会搞砸。我不知道它是否可能,但如果FTP支持锁定文件,请尝试查找。 / p>

如何解决?

最好的方法是让服务器知道它正在访问的文件处于写入过程中。如果你的ftp支持咨询锁,那么你可以使用它,这样当服务器尝试访问你的文件时(通过系统调用)内核会指示它该文件当前已被锁定,因此服务器将等待ftp释放该锁定。

在vsftp中,在VSFTPD.CONF设置中会有一个选项image,jpg,你可以启用此功能

如果您无法解决上述解决方案,那么您可以使用一些技巧,例如检查文件上次修改时间,如果它与当前时间几乎相同,那么您让php等待您认为平均的一些猜测时间。上传文件的时间。对于这种方法,您应该使用PHP将其发送到浏览器而不是服务器。即只需将图像的src从'/path/to/image.jpg'更改为'gen-image.php'即可。该脚本将读取该图像并将其刷新到浏览器

<强>发电机image.php     

lock_upload_files

请注意,上述解决方案并不理想,因为如果文件刚刚完成上传,则不会再修改57秒但浏览器请求在07:02:04说不必等待3秒钟,因为mtime会是07:02:03浏览器只能在07:02:06之后获得文件。我建议你搜索一些方法(基于cmd),使服务器和ftp齐头并进,应该知道对方的状态,因为这是导致这个问题的根本原因。