Neden olabilir değil. Png görüntüden ben gidiş-dönüş base64 kodlanmış geri. Png görüntü w / PHP için,?

4 Cevap php

Ne yapmaya çalışıyorum basit ve zihnimde çok basit olmalıdır. Sonuçlar az teşvik olmuştur. Ben yapmaya çalışıyorum Ne: Ben base64 kodlanmış PNG görüntü verilerini alan bir web sayfası var. Ben ve başarıyla doğru adımlarda veri dosya sisteminde bir görüntü yaratmak için almış olabilir. "Senaryo A" diyoruz:

$imageData = $_POST['png'];
$imageStr = base64_decode($imageData);
$image = imagecreatefromstring($imageStr);
imagepng($image, $somePath);

Bu çalışıyor. Ama şimdi sırayla aynen yukarıdaki gibi, geri dosya sistemine yazacak olan daha sonra bu görüntü, base64 kodlamak okumak ve Senaryo A göndermeye yeni bir şartı var. Bu ikinci senaryoyu geri Senaryo A, "Senaryo B" veri ve mesajları okur birini arayın. Senaryo A Ben hata alıyorum Senaryo B alınan verilere imagepng aramak için çalıştığında bu:

imagepng(): supplied argument is not a valid Image resource

Hala benimle? Etkileyici. Peki bütün bunlar ne benim için anlamı Senaryo B, dosya sistemi. Png veri okuma onu kodlama ve Senaryo A. göndermeden yolu ile yanlış bir şey (aşağıdaki gibi yapar olmasıdır w / hata giderme işlemleri o kısalık çıkarına, ama hiçbir hata) gerçekleşmekte olan -

// Read in image file, base64-encode
$fd = fopen($somePath, 'rb');
$size = filesize($somePath);
$data = fread($fd, $size);
fclose($fd);
$encoded = base64_encode($data);

Daha sonra cURL kullanarak Senaryo A nakleder, w / bir param olarak "$ kodlanmış".

Şimdi, 'Net bu yöntemin sayısız örneklerini buldum. Ben çalışmak gerekir eminim. Öyle değil. Ben de file_get_contents kullanarak denedim. Ayrıca dere ve base64 kodlama ... hayır şans olarak görüntü yakalamak için çıkış tampon kontrolünü kullanarak sonra, görüntüyü okumak için 'imagecreatefrompng' kullanarak çalıştı. Sonunda ben yukarıdaki yaklaşım basit ve en yaygın olduğunu düşünüyorum.

Özür dilemek bu mesaja çok uzun ve / veya takip etmek çok zor ise. Hvardırketli parçalar sürü hepsi bu. Herhangi bir geribildirim büyük mutluluk duyacağız.

Şerefe


GÜNCELLEME: Ben MD5 kullanarak kod boyunca adım gibi görüntü dize incelemek için Jon Skeet mükemmel öneri başına, ben sorunu daralmış ettik - Ben Senaryo B dosya sistemine görüntü yazmak bir kez, sonra tekrar okudum, o değişti . Yani:

$imageStr = base64_decode($imageData);
$image = imagecreatefromstring($imageStr);
imagepng($image, $somePath);

Ben düz w / eski fread () geri okuduğunda, MD5 imza değişti çünkü ..., verileri işlemek gibi görünüyor. Ben belki o meta ekler, imagepng işlevi olduğunu düşünüyorum? Php dokümanlar, bu konuda net değildir. Bu durumda, ben gibi bir şey, onu yazarken (), ben ne yapıyorum tersini yapmak gerekir geri yerine w / freadla görüntüyü okuma düşünüyorum:

$image = imagecreatefrompng($somePath);

... Sonra doğrudan görüntünün içeriği almak için bir yol bulmalısınız. Ben bunu nasıl anlamaya olamaz olsa: oa yolu w / çıkış görüntünün içeriği, "imagepng ($ görüntü)" gibi bir işlevi gerektirecek gibi görünüyor ... ve ben yapmak istemiyorum ne .

Bu noktada ben soru da olduğunu düşünüyorum:

  1. nasıl yapmam görünüyor ne imagepng (veya geri) geri, ya da
  2. nasıl olabilir i çıkışı bir görüntü kaynağın içeriğini doğrudan

4 Cevap

Bunu çözme sonra tekrar okuduktan sonra, Senaryo B den okuyor dosya sistemindeki verilerin MD5 hash alarak ve yine Senaryo A'da tarafından deneme önermek. Bu verileri değişiyor hangi noktada size göstermelidir.

Sadece bir düşünce olarak - veri Senaryo B den okuyor dosya sistemi üzerinde kesinlikle geçerlidir?

EDIT: Tamam, böylece düzenlemek başı olarak imagepng içeriği değişiyor kullanarak gibi görünüyor. Aslında kullanmak gerekir mi imagepng at all? Eğer gerçekten görüntü ile bir şey yapıyor musunuz? Bu sounds temelde sadece .. komut A'ya komut B'den bir dosya göndermek için çalışırken çok konum gibi yapacağını hiç opak ikili veri başka bir şey olarak dosya tedavi olmadan.

Sen GD'nin PNG desteği aslında Senaryo B den çalışan sistemde etkin olduğunu iki kez kontrol etmek isteyebilirsiniz.

Bu gün ve yaş, ama ... gerekir

if (imagetypes() & IMG_PNG) {
    echo "PNG Support is enabled";
}

P.S. Ben sadece HTML / PHP 'nin yerleşik file upload mekanizmasını kullanmak vermedi şaşırdım.

üzerinden dosya yükleyebilirsiniz Curl:

$ch = curl_init();

// file is the field name, file names are prefixed with @
// In this example, $_FILES['file'] on the remote script would have this
// file's metadata
$data = array('file' => '@/home/user/test.png');

curl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_exec($ch);

Sıfır PHP ve cURL ile deneyim, ama muhtemelen (yanlışlıkla) (bu herhangi bir oranda, ben yapmak istiyorum ilk hatadır) yerine POST GET parametresi olarak görüntü verilerini geçiyoruz?

Ben hatayı izini kolay yolu doğru base64 kodlama a) Komut B tarafından üretilen ve b) bu ​​değerleri baskı ve onları karşılaştırarak, Senaryo A tarafından alındığını sağlamak olduğunu düşünüyorum. Sorununuz nerede bu söylemeliyim.

Ben bu soruna neden olabilir görebilirsiniz Bir şey görüntü verilerini gönderme ve urlencode / urldecode kullanarak olmadığı gerçektir.

Görüntü verilerinin bazıları PHP'nin sonrası kullanım tarafından karıştırılmış, ya da herhangi bir yerde veri bir satır varsa tamamen dışında bırakılmış oluyor olabilir.