Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Zabezpieczenie przed nieistniejącymi plikami nie działa
Forum PHP.pl > Forum > Przedszkole
d0m1n1k_
Witam,
zastanawia mnie co jest z moim skryptem nie tak.
Jego działanie polega na pobieraniu zdjęć z serwera zewnętrznego.
Ze względu na ciągłe problemy z nieistniejącymi plikami (img wstawiony, ale niema go na serwerze) kombinuję ze wczesnym sprawdzaniem czy plik istnieje.
Najprostszym rozwiązaniem jakie wypaczyłem w manualu to sprawdzenie headera ale nie działa, albo przynajmniej nie zawsze działa.
Miałby ktoś jakieś uproszczenie, albo najlepiej wrzucenie wszystkiego w jedną funkcję?

  1. function check_header($url){
  2. $check_notfound = get_headers($url);
  3. $check_notfound = $check_notfound[0];
  4. return $check_notfound;
  5. }
  6.  
  7. function save_image($inPath,$outPath){
  8. $check_notfoundb = get_headers($inPath);
  9. $check_notfoundb = $check_notfoundb[0];
  10.  
  11. if(($check_notfoundb == 'HTTP/1.1 404 Not Found') OR ($check_notfoundb == 'not found')){
  12. //Error
  13. $out = "Error_pliku";
  14. }else{
  15. if(!$inPath || !$outPath){
  16. $out = "Error_pliku";
  17. }else{
  18. $in = fopen($inPath, "rb");
  19. $out = fopen($outPath, "wb");
  20. while($chunk = fread($in,8192)){
  21. fwrite($out, $chunk, 8192);
  22. }
  23. fclose($in);
  24. fclose($out);
  25. }
  26. }
  27. }
  28.  
  29.  
  30. if (is_array($obrazy) || is_object($obrazy)){
  31. foreach($obrazy as $imxg){
  32. if((check_header($imxg) == 'HTTP/1.1 404 Not Found') OR (check_header($imxg) == 'not found')){
  33. echo "Blad pliku - nie istnieje (HTTP/1.1 404 Not Found).";
  34. }else{
  35. $name = md5(date('YmdHis') . md5(md5(rand(1,999999999999)))) . ".jpg";
  36. $check_si = $fold . $name;
  37. save_image($imxg,$check_si);
  38.  
  39. $black = "000000";
  40. $image = WideImage::load("" . $fold.$name . "");
  41. $resize1 = $image->resize(800, 600);
  42. $resize2 = $resize1->resizeCanvas('800', '600', 'center', 'center', $black);
  43. $resize2->saveToFile("" . $fold.$name . "", 80);
  44.  
  45. $add_new_file = mysql_query("INSERT INTO `photos`(`ph_id`, `ph_user`, `ph_vehi`, `ph_cate`, `ph_imag`, `ph_fold`, `ph_data`) VALUES (NULL, NULL, '$id', '$cat_gogo', '" . $name . "', '$catnbr', NOW())");
  46. echo "<font color=\"green\">++</font>, ";
  47. }
  48. }
  49. }

Nie mam już pomysłu jak mogę poprawić ten kod, tak aby w końcu działały absolutnie poprawnie i był całkowicie odporny na errory spowodowane brakiem pliku(ów).
Z góry dziękuję za pomoc.
Comandeer
Tak po prawdzie to bym sprawdzał czy nie zwróciło kodu innego niż 200 – de facto wszystkie inne oznaczałyby, że coś jest nie tak.

No i jak serwer działa na HTTP/2, to raczej w 1. linijce nie otrzymasz HTTP/1.1 (choć nie wiem jak ze wsparciem HTTP/2 w PHP).
d0m1n1k_
Serwery które kod obsługuje są na HTTP/1.1
Kwestia kodu 200 załatwiłem następującą funkcją i pętlą:

  1. function is_url_exist($url){
  2. $ch = curl_init($url);
  3. curl_setopt($ch, CURLOPT_NOBODY, true);
  4. curl_exec($ch);
  5. $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  6.  
  7. if($code == 200){
  8. $status = true;
  9. }else{
  10. $status = false;
  11. }
  12. curl_close($ch);
  13. return $status;
  14. }
  15.  
  16.  
  17. if (is_array($obrazy) || is_object($obrazy)){
  18. foreach($obrazy as $imxg){
  19. if(is_url_exist($imxg) != TRUE){
  20. echo "<font color=\"red\">--</font>, ";
  21. }else{
  22. if((check_header($imxg) == 'HTTP/1.1 404 Not Found') OR (check_header($imxg) == 'not found')){
  23. /*****DALSZA CZĘŚĆ KODU Z PIERWSZEGO POSTU*******/
  24. }
  25. }
  26. }
  27. }

Proszę tylko o podpowiedź czy to powinno załatwić sprawę.
Kod już dodałem do pętli i jak na razie działa - od jakichś 20 minut.
Mam nadzieję, że będzie dobrze :-)
Comandeer
Jeśli serwer nie kłamie, to kod 200 powinien oznaczać, że zwrócono poprawnie zasób.
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.