2012-04-26 19 views
5

के साथ नवीनतम फ़ाइल प्राप्त करते समय आंशिक रूप से अपलोड की गई फ़ाइलों (एफ़टीपी के माध्यम से) से बचें, मुझे पता है कि इसका शीर्षक थोड़ा अजीब है, लेकिन मैं वहां जाऊंगा।AJAX और PHP

मेरे पास एक लैपटॉप के लिए एक कैमरा है। रिमोट शूटिंग का उपयोग करना, जब फोटोग्राफर फोटो लेता है तो इसे लैपटॉप की हार्ड ड्राइव पर एक फ़ोल्डर में सहेजा जाता है। फ़ोल्डर पर एक ऑटोमेटर (मैक ओएस एक्स) एक्शन सेट अप होता है जब भी कोई नई फ़ाइल दिखाई देती है, तो यह इसका आकार बदलती है और ट्रांसमिट का उपयोग करके इसे एफ़टीपी तक पहुंचाती है।

यहाँ मैं हाल ही में फ़ोटो ली प्रदर्शित एक वेब पेज है जहां कोड में आता है।

। यह बार-बार जांचने के लिए AJAX का उपयोग करता है कि कोई नई फ़ाइल अपलोड की गई है या नहीं, और यदि यह है, तो नई तस्वीर लोड करें और पुरानी तस्वीर के साथ इसे क्रॉसफ़ेड करें। पेज पर जावास्क्रिप्ट चल रहा है।

(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); 

और यहाँ दो PHP फ़ाइलों है कि जावास्क्रिप्ट

getFolderState.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; 
    } 
} 

मैं (एक और सुझाव के माध्यम से) सोच रहा हूँ ने कहा कि मुझे लगता है कि तस्वीर ताज़ा से कोड बंद हो जाता है और जब निकाल दिया जाता है अपलोड पर ताला फ़ाइल किसी तरह जोड़ने की आवश्यकता है अपलोड किया जाता है, लेकिन यह देखते हुए कि मैं कैमरे से जुड़े कंप्यूटर पर किसी भी प्रकार का वेब सर्वर नहीं चला रहा हूं, मुझे यकीन नहीं है कि इसे कैसे पूरा किया जाए। मुझे सुझाव पसंद आएंगे।

+1

जब तक आप 'लॉक' फ़ाइल या अपलोड करने के रूप में कुछ स्टोर नहीं कर सकते, तो PHP कैसे पता चलेगा कि आप स्थानांतरण के बीच में हैं? शायद सबसे आसान समाधान। 'Filename.lck' अपलोड करें और इसे शामिल करने से पहले इसके लिए जांचें। फिर जब आप स्थानांतरित कर रहे हों तो लॉक हटा दें। – MetalFrog

+0

यह वास्तव में एक महान समाधान की तरह लगता है लेकिन मुझे यकीन नहीं है कि ऐसा करने के बारे में कैसे जाना है, क्योंकि फ़ाइल अपलोड में कोई वास्तविक कोड शामिल नहीं है। –

+0

हाँ, मुझे ऑटोमेटर के बारे में कुछ भी पता नहीं है, बस वहां एक विचार फेंकने की कोशिश कर रहा था। इच्छा है कि मैं और मदद कर सकता हूं। – MetalFrog

उत्तर

3

इसे हल करने के लिए कई मार्ग हैं, जो सुझाव देने के लिए सबसे बेहतर हैं। मुझे लगता है कि सबसे आसान और तेज़ समाधान, हालांकि, एक टीएमपी डीआईआर को एफ़टीपी है और जब स्थानांतरण पूरा हो जाता है तो फ़ाइल की उत्पादन निर्देशिका में एक चाल को ट्रिगर करता है। क्या आपके स्थानीय ऑटोमेटर नौकरी के पास संचार के साथ इस सौदे में ऐसी व्यवस्था है?

+0

क्या संभावित रूप से उसी मुद्दे पर नहीं चल सका, बस उन्हें पहले स्थान पर अपलोड करने के बजाय सर्वर पर फ़ोल्डर के बीच फ़ोटो को स्थानांतरित करने में? –

+0

मुझे ऐसा नहीं लगता है। कदम लगभग तात्कालिक होगा। – JAAulde

+0

मुझे विश्वास नहीं है कि मेरे पास ऑटोमेटर के साथ रिमोट सर्वर पर फ़ाइलों को स्थानांतरित करने के लिए एक तंत्र है, केवल उन्हें अपलोड करें। क्या आप इसे पूरा करने के लिए एक और तरीका सोच सकते हैं? हो सकता है कि अगर मैंने एफ़टीपी के माध्यम से अपलोड करने के बजाए सर्वर को ड्राइव के रूप में घुमाया, तो मैं फाइलों को इसके चारों ओर ले जा सकता था? –

1

मैं PHP स्क्रिप्ट को एक छोटी (छोटी) देरी के साथ एक लूप में फाइलसाइज की जांच कर दूंगा, और यदि यह मेल खाता है तो फ़ाइल को आउटपुट करें। अन्यथा, लूप जब तक यह करता है।

+0

PHP कोड वास्तव में नहीं जानता कि _incoming_ तस्वीर कितनी बड़ी होनी चाहिए ... – JAAulde

+1

आप ऑटोमेटर स्क्रिप्ट पहले फ़ाइल नाम की जांच कर सकते हैं, फिर उसे अपलोड करें छोटी टेक्स्ट फ़ाइल, और PHP स्क्रिप्ट की जांच करें और उससे मेल खाएं। या, बस जांचें कि लूप के दो पुनरावृत्तियों के बीच फ़ाइल आकार DIFFERS। – gcochard

+0

सच है, यह एक विकल्प है। – JAAulde