मैं एक जेनरिक आर्ट प्रोजेक्ट पर काम कर रहा हूँ जहाँ मैं उपयोगकर्ताओं को एल्गोरिदम से परिणामी छवियों को सहेजने की अनुमति देना चाहूँगा। सामान्य विचार है:
- एक जेनरेटर एल्गोरिथ्म का उपयोग करके HTML5 कैनवस पर एक छवि बनाएं
- जब छवि पूरी हो जाती है, तो उपयोगकर्ताओं को सर्वर पर छवि फ़ाइल के रूप में कैनवास को बचाने की अनुमति दें
- उपयोगकर्ता को छवि को डाउनलोड करने की अनुमति दें या एल्गोरिथ्म का उपयोग करके उत्पादित टुकड़ों के गैलरी में जोड़ें।
हालाँकि, मैं दूसरे कदम पर अटक गया हूँ। Google की कुछ मदद के बाद, मुझे यह ब्लॉग पोस्ट मिला , जो मुझे ठीक वही लग रहा था जो मैं चाहता था:
जिसके कारण जावास्क्रिप्ट कोड:
function saveImage() {
var canvasData = canvas.toDataURL("image/png");
var ajax = new XMLHttpRequest();
ajax.open("POST", "testSave.php", false);
ajax.onreadystatechange = function() {
console.log(ajax.responseText);
}
ajax.setRequestHeader("Content-Type", "application/upload");
ajax.send("imgData=" + canvasData);
}
और इसी PHP (testSave.php):
<?php
if (isset($GLOBALS["HTTP_RAW_POST_DATA"])) {
$imageData = $GLOBALS['HTTP_RAW_POST_DATA'];
$filteredData = substr($imageData, strpos($imageData, ",") + 1);
$unencodedData = base64_decode($filteredData);
$fp = fopen('/path/to/file.png', 'wb');
fwrite($fp, $unencodedData);
fclose($fp);
}
?>
लेकिन यह कुछ भी करने के लिए प्रतीत नहीं होता है।
अधिक Googling इस ब्लॉग पोस्ट को बदल देता है जो पिछले ट्यूटोरियल से हटकर है। बहुत अलग नहीं है, लेकिन शायद एक कोशिश के लायक है:
$data = $_POST['imgData'];
$file = "/path/to/file.png";
$uri = substr($data,strpos($data, ",") + 1);
file_put_contents($file, base64_decode($uri));
echo $file;
यह एक फ़ाइल (yay) बनाता है, लेकिन यह दूषित है और इसमें कुछ भी नहीं लगता है। यह खाली भी दिखाई देता है (फ़ाइल का आकार 0)।
क्या वास्तव में कुछ स्पष्ट है कि मैं गलत कर रहा हूं? जिस पथ पर मैं अपनी फ़ाइल संग्रहीत कर रहा हूं वह लेखन योग्य है, इसलिए यह कोई समस्या नहीं है, लेकिन कुछ भी नहीं हो रहा है और मुझे यकीन नहीं है कि यह कैसे डिबग करना है।
संपादित करें
साल्विडोर डाली की लिंक के बाद मैंने AJAX के अनुरोध को बदल दिया:
function saveImage() {
var canvasData = canvas.toDataURL("image/png");
var xmlHttpReq = false;
if (window.XMLHttpRequest) {
ajax = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
ajax = new ActiveXObject("Microsoft.XMLHTTP");
}
ajax.open("POST", "testSave.php", false);
ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
ajax.onreadystatechange = function() {
console.log(ajax.responseText);
}
ajax.send("imgData=" + canvasData);
}
और अब छवि फ़ाइल बनाई गई है और खाली नहीं है! ऐसा लगता है जैसे सामग्री प्रकार मायने रखता है और इसे बदलने x-www-form-urlencoded
से छवि डेटा भेजने की अनुमति मिलती है।
कंसोल बेस 64 कोड का (बल्कि बड़ा) स्ट्रिंग लौटाता है और डेटाफाइल ~ 140 kB है। हालाँकि, मैं अभी भी इसे नहीं खोल सकता हूँ और यह एक छवि के रूप में स्वरूपित नहीं किया जा रहा है।
$data
दूसरे php कोड में) गूँजता हूँ तो मुझे जो भी मिलता है वह एक खाली लाइन है। ऐसा क्यों होगा? ऐसा लगता है कि शायद भेजा जा रहा डेटा सही नहीं है, लेकिन ऐसा लगता है कि मैं इसे उदाहरण के शो की तरह भेज रहा हूं ...
DataUriUpload
। इसे यहां प्रलेखित किया गया है और सत्यापन और लागू करने के कई अतिरिक्त साधनों के साथ आता है।
ajax.send(canvasData );
जब आप इसका उपयोग करते हैं तो पहला ब्लॉग आपके द्वारा प्रदान किए गए उपयोगों को पोस्ट करता हैajax.send("imgData="+canvasData);
। इसलिए$GLOBALS["HTTP_RAW_POST_DATA"]
वह नहीं होगा जो आप उम्मीद करते हैं, आपको शायद उपयोग करना चाहिए$_POST['imgData']
।