2012-11-14 15 views
39

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

$month = date('Yd') 
file_put_contents("upload/promotions/".$month."/".$image, $contents_data); 

के बाद, मैं त्रुटि परिणाम मिलता है।

संदेश: file_put_contents (अपलोड/प्रोत्साहन/201,211/ang232.png): स्ट्रीम को खोलने में विफल: ऐसा कोई फ़ाइल या निर्देशिका

अगर मैं अस्तित्व फ़ोल्डर में केवल फ़ाइल डालने की कोशिश की, यह काम किया । हालांकि, यह एक नया फ़ोल्डर बनाने में विफल रहा।

क्या इस समस्या को हल करने का कोई तरीका है?

उत्तर

97

file_put_contents() निर्देशिका संरचना का निर्माण नहीं करता। केवल फाइल

महीने निर्देशिका मौजूद है या नहीं, तो आपको यह जांचने के लिए अपनी स्क्रिप्ट में तर्क जोड़ने की आवश्यकता होगी। यदि नहीं, तो पहले mkdir() का उपयोग करें।

if (!is_dir('upload/promotions/' . $month)) { 
    // dir doesn't exist, make it 
    mkdir('upload/promotions/' . $month); 
} 

file_put_contents('upload/promotions/' . $month . '/' . $image, $contents_data); 

अद्यतन:mkdir()$recursive का एक तिहाई पैरामीटर जो किसी भी लापता निर्देशिका संरचना बनाएगा स्वीकार करता है। यदि आपको एकाधिक निर्देशिकाएं बनाने की आवश्यकता है तो उपयोगी हो सकता है। पुनरावर्ती और निर्देशिका अनुमतियाँ 777 करने के लिए सेट के साथ

उदाहरण:

mkdir('upload/promotions/' . $month, 0777, true); 
+1

भयानक! धन्यवाद! – Jake

5

ऊपर जवाब के संशोधन यह थोड़ा अधिक सामान्य बनाने के लिए, (स्वचालित रूप से पता लगाता है और सिस्टम पर मनमाने ढंग से फ़ाइल नाम से फ़ोल्डर बनाता स्लैश)

पीएस पिछले जवाब भयानक

/** 
* create file with content, and create folder structure if doesn't exist 
* @param String $filepath 
* @param String $message 
*/ 
function forceFilePutContents ($filepath, $message){ 
    try { 
     $isInFolder = preg_match("/^(.*)\/([^\/]+)$/", $filepath, $filepathMatches); 
     if($isInFolder) { 
      $folderName = $filepathMatches[1]; 
      $fileName = $filepathMatches[2]; 
      if (!is_dir($folderName)) { 
       mkdir($folderName, 0777, true); 
      } 
     } 
     file_put_contents($filepath, $message); 
    } catch (Exception $e) { 
     echo "ERR: error writing '$message' to '$filepath', ". $e->getMessage(); 
    } 
} 
+2

बिल्कुल अनावश्यक ... तुम बस की जांच कर सकता है, तो निर्देशिका मौजूद है। अगर 'mkdir ($ fileDestinationDir, 0777, true) को कॉल न करें; '। और फिर 'file_put_contents' पर कॉल करें। जबकि * NIX सिस्टम का उपयोग '/' निर्देशिका विभाजक के रूप में, विंडोज परवाह नहीं करता और आप 'बिना किसी समस्या के ('/ आगे/स्लैश के साथ/path /')' mkdir कर सकते हैं। –

+0

शांत, अच्छे अंक, रिकर्सन ध्वज – aqm

-3

मैंने एक ऐसा फ़ंक्शन लिखा जो आपको पसंद हो सकता है। इसे फोर्सडिर कहा जाता है()। यह मूल रूप से जांचता है कि क्या आप चाहते हैं कि डीआईआर मौजूद है या नहीं। यदि ऐसा है, तो यह कुछ भी नहीं करता है। यदि नहीं, तो यह निर्देशिका बनाएगा। एक कारण बस के बजाय इस सुविधा का उपयोग करने के लिए, mkdir, है कि इस समारोह के रूप में अच्छी तरह से .. nexted फ़ोल्डर बना सकते हैं उदाहरण के लिए ('अपलोड/प्रोत्साहन/जनवरी/firstHalfOfTheMonth')। वांछित dir_path के लिए बस पथ जोड़ें।

function forceDir($dir){ 
    if(!is_dir($dir)){ 
     $dir_p = explode('/',$dir); 
     for($a = 1 ; $a <= count($dir_p) ; $a++){ 
      @mkdir(implode('/',array_slice($dir_p,0,$a))); 
     } 
    } 
} 
+3

जोड़ना आप mqdir() को तीसरे पैरामीटर के रूप में 'सत्य' भी जोड़ सकते हैं। – rjmunro

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