2009-04-15 11 views
18

क्या आप एक PHP सत्र में एक छवि स्टोर कर सकते हैं?PHP - सत्र डेटा में स्टोर छवियां?

मेरे पास मेरी साइट पर PHP का उपयोग करके एक बहु-चरण पंजीकरण प्रक्रिया है। चरणों में से एक पर, उपयोगकर्ता अपनी कंपनी लोगो (छवि) अपलोड कर सकते हैं।

अंतिम चरण उनके क्रेडिट कार्ड को संसाधित करना है।

तो इससे पहले कि मैं वेब सर्वर और छवि स्थान पर किसी भी छवि को डेटाबेस में लिखूं, मैं यह सुनिश्चित करना चाहता हूं कि उनका क्रेडिट कार्ड मान्य और प्रक्रिया हो।

ऐसे में, क्या सैद्धांतिक रूप से उस छवि डेटा को अस्थायी रूप से संग्रहीत करना संभव है?

यदि नहीं, तो लोग उस डेटा को करने से पहले फ़ॉर्म पर छवि डेटा को अस्थायी रूप से कैसे स्टोर करते हैं?

उत्तर

29

आप छवियों के आकार के आधार पर अपने सत्र के स्मृति उपयोग की अपेक्षा कर सकते हैं। ऐसा करने के लिए, आपको फ़ाइल सामग्री को सत्र चर में सहेजना होगा।

यदि यह सत्र डेटा में है और अपलोड के बाद आपके पास कई चरणों हैं तो छवि को फिर से लोड किया जाएगा (सत्र में) प्रत्येक पृष्ठ दृश्य को पूरा होने तक देखें।

मैं व्यक्तिगत रूप से बाइनरी फ़ाइल रखने के लिए सत्र का उपयोग करने की सिफारिश करता हूं। पंजीकरण पूर्ण होने तक डिस्क पर छवि को एक अस्थायी स्थान में सहेजना। मैं केवल सत्र में अस्थायी फ़ाइल के पथ को बचाऊंगा। जब ट्रांससिटोन पूरा हो जाता है तो इसे उचित स्थान पर ले जाएं और अपने डीबी सम्मिलित करें।

इसके अलावा, संक्षेप में, सत्र डेटा डिस्क (या डीबी) पर संग्रहीत किया जाता है ताकि आप एक बार छवि फ़ाइल को सहेज सकें और फिर एक बार पूर्ण हो जाएं।

+2

पंजीकरण में विफल होने पर क्या होगा? आप कैसे जानेंगे कि कौन सी छवि को हटाना है, क्योंकि यह किसी अन्य PHP उदाहरण से संबंधित एक छवि हो सकती है? – Burimi

0

हां, आप एक PHP सत्र में एक छवि स्टोर कर सकते हैं। इसे एक स्ट्रिंग (यानी बाइनरी डेटा) के रूप में PHP में प्राप्त करें और फिर आप इसे सत्र में डाल सकते हैं।

आप इसे जितना बड़ा होना चाहते हैं उतना बड़ा होना चाहते हैं और जैसे ही आपको इसकी आवश्यकता नहीं है, आपको इसे हटाने की आवश्यकता है क्योंकि सत्र में जानकारी के बड़े टुकड़े सत्र स्टार्टअप को धीमा कर देंगे।

3

जब कोई फ़ाइल अपलोड की जाती है, तो उसे $ _FILES सरणी में एक अस्थायी नाम असाइन किया जाता है। मुझे उन फ़ाइलों की सटीक उम्र पता नहीं है, लेकिन आप सत्र में उस नाम को कैप्चर करने में सक्षम हो सकते हैं और सीसी सत्यापित होने के बाद move_uploaded_file() कॉल को बंद कर सकते हैं।

या, आप पहले सीसी कदम कर सकते हैं।

+0

PHP स्क्रिप्ट निष्पादन समाप्त होने पर $ _FILES सरणी में सभी फ़ाइलों को हटा दिया जाता है, यानी यदि आप उन्हें किसी अन्य स्थान पर नहीं ले जाते हैं तो सभी अपलोड की गई फ़ाइलें खो जाती हैं। – Serg

9

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

यदि आप सत्र में किसी छवि को आज़माकर संग्रहीत करते हैं, तो आप इसे गलत कर रहे हैं।

1

कभी-कभी हमें डेटाबेस में डेटा सहेजने से पहले पृष्ठ का पूर्वावलोकन/पुष्टि करने की आवश्यकता होती है। लेकिन पुष्टिकरण पृष्ठ पर छवि फ़ाइल थोड़ा अलग है। आप $_SESSION['s_name'] = $_FILES['f_name'] coz सत्र केवल टेक्स्ट फ़ाइल नहीं रख सकते हैं। सत्र में फ़ाइल सामग्री/बाइनरी मान रखने के वैकल्पिक तरीके से।

$_SESSION['obj_image_session'] = file_get_contents($_FILES['image_name']['tmp_name']); 

$file= "new_file.jpg"; 
$fp=($file,"w"); 

fwrite($fp,$_SESSION['obj_image_session']); 
1

आप डेटा रखने के लिए है, तो मैं base64_encoded स्ट्रिंग के रूप में यह ध्यान में रखते हुए सुझाव है।आप सीधे ब्राउज़र पर base64_encode छवि डेटा भेज सकते हैं।

यदि मैं इसी स्थिति में होता तो मैं छवि को सहेज लेता और सत्र/डीबी में छवि के बारे में जानकारी रखता। अगर किसी कारण से पंजीकरण विफल रहता है, तो मैं बाद में फ़ाइल को अनलिंक कर दूंगा। और कभी-कभी छवियों के साथ लापता लिंक का पता लगाने के लिए क्रॉन नौकरियां चलाते हैं।

लेकिन मैं वास्तव में आपको दूसरे विकल्प पर टिकने और परेशानी से बचने का सुझाव दूंगा।

0

आप सत्र में छवि डेटा को आसानी से एन्कोड किए गए आधार के रूप में संग्रहीत कर सकते हैं। उत्पादन सर्वर में आपको पर्याप्त रैम होना चाहिए। mongoDB में डालने से पहले अपडेट और परिवर्तन के लिए 40 एमबी 4 छवियों/ऐप्स तक मेरे एप्लिकेशन की आवश्यकता थी। (बेस एन्कोडिंग 1.3 गुना बड़ा छवि का आकार बनाता है।)

$tmpNameSS1 = $_FILES["screenshot1"]["tmp_name"]; 
    $fp  = fopen($tmpNameSS1, 'r'); 
    $rawDataSS1 = fread($fp, filesize($tmpNameSS1)); 
    fclose($fp); 
    $SS1FileName = $_FILES["screenshot1"]["name"]; 
    $encodedSS1Data = base64_encode($rawDataSS1); 

    registry::update('sCreateSS1Name', $SS1FileName); 
    registry::update('sCreateSS1Data', $encodedSS1Data); 

एक मामला हो जाएगा: आप अपलोड की गई करने के लिए कई छवि और आकार और प्रकार के लिए दोनों क्लाइंट और सर्वर सत्यापन की है। सत्र से लाने के लिए तेज़ है। छवि को धारण करने वाले परिवर्तनीय डीबी को डालने के बाद। कोड के बाद ब्लॉक के अंत तक पहुँच जाता है

<img src="data:image/;base64,<?php echo registry::get('sCreateSS1Data'); ?>"/> 

आप रिक्त स्ट्रिंग के साथ छवि के लिए सत्र को अद्यतन कर सकते हैं:

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

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