Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: obrazki przy pomocy readfile() i ajax
Forum PHP.pl > Forum > PHP
agmakonts
Witam
mam taki kod:
  1.  
  2. header('Content-Type: '.$post->post_mime_type);
  3.  
  4. $name = basename($post->guid);
  5. $base = home_url();
  6. $path= $_SERVER{'DOCUMENT_ROOT'}.str_replace($base,'',$post->guid);
  7. header ('Content-Disposition: inline; filename='.$name);
  8. header ('Content-length: ' .filesize($path));
  9. readfile($path);
  10.  


Generalnie wszystko chodzi super dopóki zapytanie nie jest ajaxowe. Gdy leci prez XMLHttpRequest przeglądarka po prostu się zawiesza.
Nie wiem w czym problem a nigdzie nie znalazłem pomocy. Ma ktoś jakiś pomysł?
fander
Dziwisz się że nie działa skoro próbujesz w obiekt odpowiedzi Ajaxa wsadzić zawartość obrazka. Jeśli nawet załadowałbyś zawartość obrazka, to co z tymi danymi będziesz w stanie zrobić ?
agmakonts
Rozchodzi się tu o fancybox który ma lądować obrazek, gdy w adresie był statyczny plik jpg wszystko było super ale chciałem mieć pewność że gdy coś się stanie z JS albo stronę będzie zwiedzać bot nie otrzymają pliku jpg tylko kolejną stronę z nagłówkiem, stopką, nawigacją itp. Ten kod jest częścią skryptu który w zależności od typu żądania daje albo obrazek albo html. Teoretycznie jak Fancybox pobiera sobie obrazek z serwera to nie powinno go interesować co go generuje a z resztą to cieszyłbym się nawet z błędu a nie tak jak to jest teraz z zawieszenia browsera.

I przyznaje się, termin AJAX to tu trochę nie pasuje ;]
flashdev
Pewnie nie do końca o to chodzi, ale zgodnie z tematem obrazki wczytują się przy pomocy readfile i ajax, więc może ten kod na coś się przyda.

  1. <?php
  2. if( isset($_GET[img]) ){
  3. readfile('img.png');
  4. echo 'data:image/png;base64,'.base64_encode(ob_get_clean());
  5. }else{
  6. ?>
  7. <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
  8. <script>
  9. $(function(){
  10. $('button').click(function(){
  11. $.ajax({
  12. url: 'index.php?img',
  13. success: function(url){
  14. $('body').append('<img src="'+url+'" />');
  15. }
  16. });
  17. });
  18. });
  19. </script>
  20. <button>Zaladuj obraz</button>
  21. <?php
  22. }
agmakonts
@flashdev - dzięki za kod, co prawda nie udało mi się przerobić go by działał u mnie sad.gif

Postaram się to lepiej wytłumaczyć:

Gdy wchodzę w wordpressową stronę załącznika która zawiera kod z pierwszego postu wszystko jest ok i obrazek jest wyświetlany w przeglądarce tak samo jakby wpisać jego bezpośredni url.

nagłówki po wpisaniu adresu bezpośrednio
http://img513.imageshack.us/img513/7695/headersa.png
efekt tego samego adresu załadowanego przez JS do lightboxa/fancyboxa
http://img502.imageshack.us/img502/8535/screenq.png

Generalnie wygląda to tak jakby nawalały nagłówki ale dlaczego to nie mam pojęcia, przecież jakbym tam podał adres do pliku JPG bezpośrednio to pokazałby się on w nowej warstwie bez problemu.


bim2
Nie możesz tak załądować bo nie potraktuje tego przeglądarka jako obrazka. Ja robisz loadAjax(tutaj masz jakis url) to ten url z ajaxa daj jaki <img src="tutaj ten url" /> i wtedy obrazek ci przegladarka od nowa wczyta winksmiley.jpg
agmakonts
Nie do końca rozumiem.
Nagłówki wyglądają ok po załadowaniu tego przez js http://img24.imageshack.us/img24/1300/jsheader.png więc nie wiem czemu przeglądarka ma nie traktować tego jako obrazek.
bim2
No ale jak ty to łądujesz do jS? Poprzez AJAXA? Ajax służy do pobrania danych w formie tekstu... nie obrazka. Wszystko poprawnie wyświetla. Tak by to wyglądało gdybyś wyświetlił sobie zawartość obrazka jako tekst. Dlatego musisz użyć do tego tag <img>
agmakonts
Od początku:

Cały skrypt jest po to by w laghtboxie wyświetlał się sam obrazek a przy wejść bezpośrednim html.

Wiem ze jak bym pobrał dane bezpośrednio to tak by wyglądały i wiem że powinny być w img ale.... całość jest ładowana do Fancyboxa (http://fancybox.net/) który automatycznie rozpoznaje czy ma załadować html czy img.

Może i faktycznie to pytanie powinno być w JS, nie znam na tyle javascriptu by być pewnym. Generalnie mimo poprawnych nagłówków fancybox nie widzi że jest to obrazek i na tym polega problem.

Jeśli ma ktoś lepszy pomysł na obejście problemu w Wordpressie to chętnie skorzystam bo siedzę nad tym już chyba 12H bez przerwy i zaczynam czuć się pokonany.

Początek pliku attachment.php który ładuje i fancybox i ma być ładowany bezpośrednio wygląda tak:

  1. <?php
  2. if($_SERVER["HTTP_X_REQUESTED_WITH"] == 'XMLHttpRequest')
  3. {
  4. if (have_posts()) :
  5. while (have_posts()) : the_post();
  6.  
  7. header('Content-Type: '.$post->post_mime_type);
  8.  
  9. $name = basename($post->guid);
  10. $base = home_url();
  11. $replace = str_replace($base,'',$post->guid);
  12.  
  13. header ('Content-length: ' .filesize($_SERVER{'DOCUMENT_ROOT'}.$replace));
  14. readfile($_SERVER{'DOCUMENT_ROOT'}.$replace);
  15.  
  16. ?>
  17. <?php
  18.  
  19. endwhile; endif;
  20. }else {
  21.  
  22.  
  23. ?>
  24.  
  25. <?php get_header();?>
  26. <?php
  27. global $options;
  28. foreach ($options as $value) {
  29. if (get_settings( $value['id'] ) === FALSE) { $$value['id'] = $value['std']; } else { $$value['id'] = get_settings( $value['id'] ); }
  30. }
  31. ?>
  32. <?php if (have_posts()) : ?>
  33. <?php while (have_posts()) : the_post(); ?>
  34.  
  35.  
  36. <section id="header-image">
  37. <?php echo get_the_post_thumbnail($post->post_parent, 'header' ); ?>
  38. </section>
  39.  
  40. <section id="single-title">
  41. <h2 class="single">
  42. <?php
  43. $parent_title = get_the_title($post->post_parent);
  44. echo $parent_title;
  45. ?>
  46. </h2>
  47.  
  48. (...................)
  49.  
  50.  



JS Fancybox (lightbox) sprawdza parametr href odnośnika i w zalezności od zawartości ładuje albo html albo obrazek do tagu <img>. W href jest adres attachment.php z odpowiednimi parametrami.

Live: http://91.193.211.226/galeria/femespik
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.