gpt4 book ai didi

php - 使用 ajax 和 PHP 获取最新文件时避免部分上传的文件(通过 FTP)

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:39:26 27 4
gpt4 key购买 nike

我知道这个标题有点奇怪,但我会讲的。

我有一台连接到笔记本电脑上的相机。使用 Remote Shooting,当摄影师拍摄照片时,照片将保存到笔记本电脑硬盘上的文件夹中。在文件夹上设置了一个 Automator (Mac OS X) 操作,每当出现新文件时,它都会调整它的大小并使用 Transmit 将其推送到 FTP。

这里是代码的来源。

我有一个网页显示最近拍摄的照片。它使用 ajax 反复检查是否有新文件上传,如果有,则加载新照片并与旧照片交叉淡入淡出。这是页面上运行的 Javascript。

(function() {
var delay, refreshLoop;

// Alias to setTimeout that reverses the parameters, making it much cleaner in code (for CoffeeScript)
delay = function(time, callback) {
return setTimeout(callback, time);
};

// Function that drives the loop of refreshing photos
refreshLoop = function(currentFolderState, refreshRate) {
// Get the new folder state
$.get("ajax/getFolderState.php", function(newFolderState) {
// If the new folder state is different
if (newFolderState !== currentFolderState) {
// Get the newest photo
$.get("ajax/getNewestPhoto.php", function(photoFilename) {
var img;
// Create the new image element
img = $('<img class="new-photo"/>')
// Append the src attribute to it after so it can BG load
.attr('src', "/events/mindsmack/booth/cinco-de-mindsmack-2012/" + photoFilename)
// When the image is loaded
.load(function() {
// Append the image to the photos container
$('#photos').append(img);
// Crossfade it with the old photo
$('#photos .current-photo').fadeOut();
$('#photos .new-photo').fadeIn().removeClass("new-photo").addClass("current-photo");
});
});
}
// Wait for the refresh rate and then repeat
delay(refreshRate, function() {
refreshLoop(newFolderState, refreshRate);
});
});
};

// Document Ready
$(function() {
var refreshRate;

// Load the first photo
$.get("ajax/getNewestPhoto.php", function(photoFilename) {
$('#photos').append("<img src='/events/mindsmack/booth/cinco-de-mindsmack-2012/" + photoFilename + "' class='current-photo' />");
});
refreshRate = 2000;
// After the timeout
delay(refreshRate, function() {
// Get the initial folder state and kick off the loop
$.get("ajax/getFolderState.php", function(initialFolderState) {
refreshLoop(initialFolderState, refreshRate);
});
});
});

}).call(this);

这是在该 Javascript 中调用的两个 PHP 文件

获取文件夹状态.php

<?php

$path = $_SERVER['DOCUMENT_ROOT'] . "/events/mindsmack/booth/cinco-de-mindsmack-2012/";

// Get a directory listing of the path where the photos are stored
$dirListing = scandir( $path );

// Echo an md5 hash of the directory listing
echo md5(serialize($dirListing));

getNewestPhoto.php

<?php

$path = $_SERVER['DOCUMENT_ROOT'] . "/events/mindsmack/booth/cinco-de-mindsmack-2012/";

// Get a directory listing of the path where the photos are stored
$listing = scandir($path);

$modTime = 0;
$mostRecent = "";

// Find the most recent file
foreach ( $listing as $file ) {
if ( is_file($path.$file) && $file !== ".DS_Store" && filectime($path.$file) > $modTime) {
$modTime = filectime($path.$file);
$mostRecent = $file;
}
}

// Echo the most recent filename
echo $mostRecent;

所有这一切几乎都完美无缺。我认为,问题在于当文件正在上传时触发循环。偶尔会拍一张照片,它只会在中途显示在页面上。根本没有抛出错误,脚本继续运行得很好,图像文件实际上缓存在那个状态,让我相信我的代码正在捕获正在进行的文件上传并且只显示文件的一部分那个时候已经上传了。

如果需要,我不介意更改我的解决方案以解决此问题,我只是不确定到底该怎么做。

编辑

根据以下建议之一,我将代码添加到我的 getNewestPhoto.php 以检查照片的文件大小,稍等片刻,然后再次检查。如果它们不同,它会返回并再次检查,直到文件大小相同。我希望这会捕获正在上传的文件,因为文件大小会在循环之间发生变化,但即使照片出现部分渲染,文件大小检查也没有捕获到它。

这是我添加的代码

$currFilesize = filesize($path . $mostRecent);
$newFilesize;

while ( true ) {
sleep(.5);
$newFilesize = filesize($path . $mostRecent);

if ( $newFilesize == $currFilesize) {
break;
}
else {
$currFilesize = $newFilesize;
}
}

我在想(通过另一个建议)我需要在上传时添加某种锁定文件,以阻止代码刷新照片并在上传完成后删除,但看到我没有运行任何一种连接到相机的计算机上的网络服务器,我不确定如何实现。我很乐意提出建议。

最佳答案

有很多方法可以解决这个问题,大多数比我要建议的要好。然而,我认为最简单和最快的解决方案是通过 FTP 传输到 tmp 目录,并在传输完成后触发将文件移动到生产目录。您的本地自动化作业在处理传输时是否有这样的机制?

关于php - 使用 ajax 和 PHP 获取最新文件时避免部分上传的文件(通过 FTP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10339858/

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