我通过" ncftpput"上传到一个光速服务器每分钟从树莓相机拍摄的图像。
我希望能够显示更新的图像,我知道如何强制浏览器使用最新版本而不是缓存图像。
因此,一切正常,但如果我在图像上传期间刷新图像(如通过shift-F5) ,则浏览器报告图像包含错误(或部分显示图像)。
在提供新图像之前,有没有办法确保图像完全加载? 我不确定我是应该在ncftp上运行还是使用PHP来确保只在完全加载后才进行交换。
图片是一个进步的jpg,但这并没有帮助...... 有什么建议吗? 感谢
答案 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齐头并进,应该知道对方的状态,因为这是导致这个问题的根本原因。