2011-12-27 6 views
9

मुझे यहां एक असली हेड-स्क्रैचर मिला है।PHP अपनी अपलोड की गई अस्थायी फ़ाइलों को स्वीकार नहीं करेगा

यह मेरा सिस्टम विन्यास है:

  • Windows Server 2008 R2
  • पीएचपी 5.3.8 एक FastCGI मॉड्यूल के रूप में स्थापित
  • IIS 7,5

यह मेरी समस्या है:

मेरे पास एक साधारण फ़ाइल अपलोड फॉर्म है। जैसा कि हम जानते हैं, जब PHP फ़ाइल अपलोड स्वीकार करता है, तो फ़ाइल को अस्थायी नाम दिया जाता है और संसाधित होने से पहले एक अस्थायी निर्देशिका में रखा जाता है। मेरे मामले में, PHP फ़ाइल को अस्थायी निर्देशिका में रखता है (जो ई: \ Inetpub_IIS \ tmp, ई: \ Inetpub_IIS \ wwwroot के बगल में होता है) लेकिन फिर तुरंत "भूल जाता है" कि कचरा कलेक्टर दिखाई देने तक फ़ाइल मौजूद है, जो अस्थायी फ़ाइल हटा देता है। अधिक विशेष रूप से, अस्थायी फ़ाइल सर्वर पर अस्थायी निर्देशिका में बनाई गई है, लेकिन जब मैं उस फ़ाइल पर sha1_file() को कॉल करता हूं, तो फ़ंक्शन कुछ भी नहीं देता है। file_exists() भी विफल रहता है। इससे मुझे लगता है कि PHP फ़ाइल नहीं ढूंढ सकता है। नीचे ProcMon लॉग दिखाता है कि PHP सही जगह पर देख रहा है।

2:43:14.9175650 PM php-cgi.exe 5020 CreateFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Desired Access: Generic Read, Disposition: Create, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: None, AllocationSize: 0, Impersonating: NT AUTHORITY\IUSR, OpenResult: Created 
2:43:14.9182596 PM php-cgi.exe 5020 CloseFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS 
2:43:14.9184424 PM php-cgi.exe 5020 QueryOpen E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS CreationTime: 12/27/2011 2:43:14 PM, LastAccessTime: 12/27/2011 2:43:14 PM, LastWriteTime: 12/27/2011 2:43:14 PM, ChangeTime: 12/27/2011 2:43:14 PM, AllocationSize: 0, EndOfFile: 0, FileAttributes: A 
2:43:14.9185907 PM php-cgi.exe 5020 CreateFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Desired Access: Write Attributes, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, Impersonating: NT AUTHORITY\IUSR, OpenResult: Opened 
2:43:14.9187896 PM php-cgi.exe 5020 SetBasicInformationFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS CreationTime: 0, LastAccessTime: 0, LastWriteTime: 0, ChangeTime: 0, FileAttributes: AN 
2:43:14.9188368 PM php-cgi.exe 5020 CloseFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS 
2:43:14.9190234 PM php-cgi.exe 5020 CreateFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Desired Access: Generic Read/Write, Disposition: OverwriteIf, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Write, AllocationSize: 0, Impersonating: NT AUTHORITY\IUSR, OpenResult: Overwritten 
2:43:14.9193771 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 0, Length: 5,119, Priority: Normal 
2:43:14.9489663 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 5,119, Length: 5,119, Priority: Normal 
2:43:14.9730524 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 10,238, Length: 5,119 
2:43:15.0054693 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 15,357, Length: 5,119, Priority: Normal 
2:43:15.0309328 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 20,476, Length: 5,119 
2:43:15.0633978 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 25,595, Length: 5,119 
2:43:15.0879028 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 30,714, Length: 5,119, Priority: Normal 
... 
2:43:17.1849721 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 383,925, Length: 5,119 
2:43:17.1851664 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 389,044, Length: 2,343 
2:43:17.1852283 PM php-cgi.exe 5020 CloseFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS 
2:43:17.5070914 PM php-cgi.exe 5020 QueryDirectory E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Filter: php3F86.tmp, 1: php3F86.tmp 
2:43:17.5083973 PM php-cgi.exe 5020 QueryDirectory E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Filter: php3F86.tmp, 1: php3F86.tmp 
2:43:17.5112593 PM php-cgi.exe 5020 QueryDirectory E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Filter: php3F86.tmp, 1: php3F86.tmp 
2:43:17.5120519 PM php-cgi.exe 5020 QueryDirectory E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Filter: php3F86.tmp, 1: php3F86.tmp 
2:43:27.5512956 PM php-cgi.exe 5020 CreateFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Desired Access: Read Attributes, Delete, Disposition: Open, Options: Non-Directory File, Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened 
2:43:27.5515084 PM php-cgi.exe 5020 QueryAttributeTagFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Attributes: A, ReparseTag: 0x0 
2:43:27.5515406 PM php-cgi.exe 5020 SetDispositionInformationFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Delete: True 
2:43:27.5515879 PM php-cgi.exe 5020 CloseFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS 

आप देख सकते हैं, ProcMon स्पष्ट रूप से बनाया जा रहा अस्थायी फ़ाइल पता चलता है, लिखा और फिर बंद कर दिया:

यहाँ मेरी ProcMon लॉग है। अंत में आप "QueryDirectory" कॉल देख सकते हैं, जो मेरी स्क्रिप्ट कॉल के साथ मेल खाता है, जो अन्य चीजों के साथ फ़ाइल के SHA1 हैश को प्राप्त करने का प्रयास करता है।

फ़ाइल अपलोड प्रपत्र एक फ्लैश वस्तु और रूप है, ज्यादा कुछ नहीं का निर्माण करने के फ्लैश वस्तु के लिए कुछ DIVs है:

यह मेरी स्क्रिप्ट है। सर्वर पर अस्थायी अपलोड फ़ाइल बनाई जा रही है इसलिए मुझे बहुत गंभीरता से संदेह है कि मेरा फॉर्म समस्या है।

<?php 
// ******************************************************************* 
// exhibit-upload.php 
// 
// ******************************************************************* 

// Reset same session ID because Adobe Flash is a flaming pile 
session_id($_POST['sessionid']); 

ob_start("ob_gzhandler"); 
require_once('inc-common.php'); 

$logFile = "logfile.txt"; 
$logHandle = fopen($logFile, 'w'); 

fwrite($logHandle, '$_FILES error: ' . $_FILES['error'] . "\n"); 

if(!empty($_FILES)) 
{ 
    // Get temp file 
    $sFileTemp = $_FILES['Filedata']['tmp_name']; 
    $sFileName = $objMySQL->sanitize($_FILES['Filedata']['name']); 

    fwrite($logHandle, "Permanent Filename: " . $sFileName . "\n"); 

    $aFileBits = explode('.', $_FILES['Filedata']['name']); 
    $sFileExt = $aFileBits[count($aFileBits) - 1]; 

    // Get SHA1 hash 
    $sFileHash = sha1_file($sFileTemp); 

    fwrite($logHandle, "Temp File Exists: " . file_exists($sFileTemp) . "\n"); 
    fwrite($logHandle, "Temp File Name: " . $sFileTemp . "\n"); 
    fwrite($logHandle, "File Hash: " . $sFileHash . "\n"); 
    sleep(10); 
    exit(); 
} 
?> 

"logfile.txt" की सामग्री को:

$_FILES error: 
Permanent Filename: picture.jpg 
Temp File Exists: 
Temp File Name: E:\Inetpub_IIS\tmp\php3F86.tmp 
File Hash: 

"नींद" कॉल मुझे पहले यह गायब हो जाता है फ़ाइल के लिए अस्थायी निर्देशिका की जाँच करने के लिए समय देने के लिए मौजूद है।

Google खोजों के दर्जनों ने मुझे अनुमतियों से संबंधित चीजों के लिए प्रेरित किया है, या उन समाधानों के लिए जो टूटे हुए अपलोड फॉर्म शामिल हैं जो कुछ भी अपलोड करने में विफल रहते हैं। फाइलें सर्वर पर बनाई जा रही हैं इसलिए स्पष्ट रूप से फॉर्म काम करता है। साथ ही, मैंने आईयूएसआर, आईआईएस_आईएसयूआरएस और डिफॉल्ट ऐपपूल को अस्थायी निर्देशिका और ई: \ Inetpub_IIS के लिए पूर्ण पहुंच देने की कोशिश की है ताकि यह देखने के लिए कि क्या संबंधित अनुमतियों के साथ इसका कुछ संबंध था या नहीं, लेकिन इससे कुछ भी नहीं बदला। क्या कोई यहां क्या हो रहा है इस बारे में कुछ सलाह दे सकता है?

संपादित करें: मैंने इसे समझ लिया।

डेवरैंडम और मैंने दोनों ने सोचा कि यह किसी प्रकार की अनुमति समस्या थी, जो सच था। हालांकि हम दोनों विंडोज अनुमतियों के बारे में सोच रहे थे, जब समस्या वास्तव में एक PHP अनुमति/विन्यास मुद्दा था। डेव के "पीछे की ओर काम" वाक्यांश ने मुझे निर्देशिका पेड़ और परीक्षण अनुमतियों के माध्यम से पीछे की तरफ जाने की सोच दी जो अंततः निम्नलिखित समाधान का उत्पादन किया।

मैं क्या किया:

<?php 
    //phpinfo(); 
    echo "Readable: " . is_readable('E:\Inetpub_IIS\tmp'); 
?> 

यह गलत लौटे:

मैं एक बहुत ही कम पटकथा लिखी। स्पष्ट रूप से निर्देशिका पठनीय नहीं थी, क्योंकि डेव ने सुझाव दिया था।

मैंने ई: \ Inetpub_IIS \ wwwroot निर्देशिका की कोशिश की, जो TRUE लौटा। हम्म। तब मुझे एहसास हुआ कि मैं पूरे दिन php_error.log की जांच करने के लिए उपेक्षित हूं। यहां मैंने पाया है:

[27-Dec-2011 16:51:43] PHP Warning: is_readable(): open_basedir restriction in effect. File(E:\Inetpub_IIS\tmp) is not within the allowed path(s): (E:\Inetpub_IIS\wwwroot) in E:\Inetpub_IIS\wwwroot\ipl\info.php on line 3 

मैंने "open_basedir प्रतिबंध प्रभाव में" गुगल किया और मेरा जवाब था।

open_basedir = E:\Inetpub_IIS\wwwroot 

मैं करने के लिए इस बदल:

open_basedir = "E:\Inetpub_IIS\wwwroot;E:\Inetpub_IIS\tmp" 

सर्वर अनुप्रयोग के रूप में इरादा काम करना शुरू किया पुनरारंभ करने के बाद php.ini फ़ाइल में, open_basedir करने वाले थे।

उम्मीद है कि यह किसी और के लिए पर्याप्त दस्तावेज है जो एक ही समस्या हो सकती है।

नैतिक (रों) कहानी का:

  • अपने open_basedir सेटिंग की जाँच करें।
  • अपने PHP त्रुटि लॉग को जांचने, सेट करने और याद रखने के लिए याद रखें।
  • बिना किसी ब्रेक के सीधे 7 घंटे के लिए एक ही समस्या पर नज़र डालें। मुझे लगता है कि मुझे लगभग स्ट्रोक था।
+0

[php man] (http://www.php.net/manual/en/features.file-upload.php) डीबग करने में आपकी सहायता के लिए त्रुटि कोड अनुभाग देखें, [print_r] (http: //www.php.net/print_r)() फ़ंक्शन ताकि आप print_r ($ _ FILES) कर सकें; – goat

+0

UPLOAD_ERR_OK वापस आ गया है। यहां कुछ print_r आउटपुट है: 'ऐरे ([the_uploaded_file] => ऐरे ([name] => picture.jpg [type] => image/jpeg [tmp_name] => ई: \ Inetpub_IIS \ tmp \ php34DD.tmp [त्रुटि] = > 0 [आकार] => 3 9 38387)) ' – TPC

+0

मुझे पता है कि आप इस एवेन्यू से नीचे हैं, लेकिन ऐसा लगता है कि यह अनुमतियां संबंधित है - विशेष रूप से (हालांकि यह विचित्र होगा) कि कुछ लिखने के लिए केवल निर्देशिका तक पहुंच है - या फाइलें बनाई जा रही हैं - और इसे/पढ़ नहीं सकती हैं। 'हर किसी के समूह' पर पूर्ण नियंत्रण आवंटित करने का प्रयास करें और देखें कि क्या यह समस्या को हल करता है, अगर यह वहां से पीछे की ओर काम करता है। – DaveRandom

उत्तर

4

जैसा कि वादा किया गया है, मेरा जवाब यहां है। यह ओपी संपादन से प्रतिलिपि/चिपकाया गया था।

मैंने इसे समझ लिया।

डेवरैंडम और मैंने दोनों ने सोचा कि यह किसी प्रकार की अनुमति समस्या थी, जो सच था। हालांकि हम दोनों विंडोज अनुमतियों के बारे में सोच रहे थे, जब समस्या वास्तव में एक PHP अनुमति/विन्यास मुद्दा था। डेव के "पीछे की ओर काम" वाक्यांश ने मुझे निर्देशिका पेड़ और परीक्षण अनुमतियों के माध्यम से पीछे की तरफ जाने की सोच दी जो अंततः निम्नलिखित समाधान का उत्पादन किया।

मैं क्या किया:

<?php 
    //phpinfo(); 
    echo "Readable: " . is_readable('E:\Inetpub_IIS\tmp'); 
?> 

यह गलत लौटे:

मैं एक बहुत ही कम पटकथा लिखी। स्पष्ट रूप से निर्देशिका पठनीय नहीं थी, क्योंकि डेव ने सुझाव दिया था।

मैंने ई: \ Inetpub_IIS \ wwwroot निर्देशिका की कोशिश की, जो TRUE लौटा। हम्म। तब मुझे एहसास हुआ कि मैं पूरे दिन php_error.log की जांच करने के लिए उपेक्षित हूं। यहां मैंने पाया है:

[27-Dec-2011 16:51:43] PHP Warning: is_readable(): open_basedir restriction in effect. File(E:\Inetpub_IIS\tmp) is not within the allowed path(s): (E:\Inetpub_IIS\wwwroot) in E:\Inetpub_IIS\wwwroot\ipl\info.php on line 3 

मैंने "open_basedir प्रतिबंध प्रभाव में" गुगल किया और मेरा जवाब था। PHP में।

open_basedir = E:\Inetpub_IIS\wwwroot 

मैं करने के लिए इस बदल:

open_basedir = "E:\Inetpub_IIS\wwwroot;E:\Inetpub_IIS\tmp" 

सर्वर अनुप्रयोग के रूप में इरादा काम करना शुरू किया पुनरारंभ करने के बाद INI फ़ाइल, open_basedir करने वाले थे।

उम्मीद है कि यह किसी और के लिए पर्याप्त दस्तावेज है जो एक ही समस्या हो सकती है।

नैतिक (रों) कहानी का:

  • अपने open_basedir सेटिंग की जाँच करें।
  • अपने PHP त्रुटि लॉग को जांचने, सेट करने और याद रखने के लिए याद रखें।
  • 7 घंटे के लिए एक ही समस्या पर नज़र डालें। मुझे लगता है कि मुझे लगभग स्ट्रोक था।
+0

मैं यह इंगित करना चाहता हूं कि यद्यपि यह तत्काल समस्या हल हो गई है, लेकिन यह समझा नहीं गया कि PHP निर्देशिका में क्यों लिखने में सक्षम था लेकिन इससे पढ़ने में सक्षम नहीं था। मुझे नहीं पता कि यह घटना थी, एक वैध बग या कॉन्फ़िगरेशन समस्या। लेकिन जो भी हो, यह अब काम करता है। – TPC

+0

अच्छी तरह से प्रलेखित उत्तर। – xbonez

संबंधित मुद्दे