Skocz do zawartości

kopiowanie zdjęć php


jaclaw

Rekomendowane odpowiedzi

Znalazłem skrypcik kopiujący zdjęcia z innego serwera na mój i wygląda on tak:

<?
$url = "https://www......com/img/19184359.jpg";
$dir = "/home/jaclaw/domains/domena.pl/public_html/images/";

$rfile = fopen($url, "r");
$lfile = fopen($dir . basename($url), "w");

fwrite($lfile, fread($rfile, 1), 1);

fclose($rfile);
fclose($lfile);
?>

no i fajnie, skopiowało mi zdjęcie do folderku images ale "plik jest uszkodzony".

Przypuszczam, że w skrypcie brak zastosowania jakiejś niezbędnej funkcji ale nie bardzo się znam na tym więc może ktoś mądrzejszy ode mnie podpowie czego brak aby skrypt działał prawidłowo :) ?

Drukarka przestaje już drukować? Kup tusze i tonery na inkhouse.pl !

Odnośnik do komentarza
Udostępnij na innych stronach

@no i fajnie, skopiowało mi zdjęcie do folderku images ale "plik jest uszkodzony".

Przy prawidłowo ustawionym serwerze fopen służy do otwierania plików lokalnych, a nie zdalnych protokołem HTTP.

Taką operację najprościej możesz zrobić za pomocą

- https://pl2.php.net/manual/en/book.curl.php lub https://php.net/manual/en/function.file-get-contents.php do pobrania danych

i

https://www.php.net/manual/en/function.file-put-contents.php do zapisania danych.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki za wskazówkę, zrobiłem to tak:

<?php
$url = "https://.....com/prods/11.jpg";
$dir = "/home/jaclaw/domains/........pl/public_html/ss/11.jpg";

$file = $url;

$current = file_get_contents($file);

file_put_contents($dir, $current);
?>

Drukarka przestaje już drukować? Kup tusze i tonery na inkhouse.pl !

Odnośnik do komentarza
Udostępnij na innych stronach

Zuch chłopak. Niepotrzebnie używasz dodatkowych zmiennych jak $file = $url; zawsze to jakaś strata pamięci .

Najprościej możesz tak:

<?php
$url = "https://.....com/prods/11.jpg";
$dir = "/home/jaclaw/domains/........pl/public_html/ss/11.jpg";
file_put_contents($dir, file_get_contents($url ));
?>

Jednak jeśli jest to jakaś poważniejsza aplikacja powinieneś zastosować kontrolę poprawności operacji chociażby czy zdalny serwer zwrócić HTTP 200, a nie np 404 za pomocą zmiennej https://www.php.net/manual/en/reserved.vari...ponseheader.php itd...

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Bardzo poważne to to nie będzie ale zaczytując 1000 obrazków (bo tyle potrzeba) warto by było wiedzieć czy obrazek istnieje do zaczytania czy nie i zaczytywać tylko wtedy gdy istnieje.

Wymodziłem coś takiego ale w miejscu "????" nie umiem postawić warunku sprawdzającego czy plik istnieje czy nie. Linia var_dump($http_response_header[0]); sama w sobie już zwraca ciąg albo taki

string(22) "HTTP/1.1 404 Not Found"

albo taki

string(15) "HTTP/1.1 200 OK"

<?php
$url = "https://.....com/prods/11.jpg";
$dir = "/home/jaclaw/domains/........pl/public_html/ss/11.jpg";

file_get_contents($url);
var_dump($http_response_header[0]);
if(?????){
file_put_contents($dir, file_get_contents($url ));}
?>

Jak to ugryźć?

Drukarka przestaje już drukować? Kup tusze i tonery na inkhouse.pl !

Odnośnik do komentarza
Udostępnij na innych stronach

Musisz sprawdzić czy w zmiennej <to jest tablica> $http_response_header znajdują się poszukiwane ciągi znaków jak

- 404 Not Found

- 200 OK

możesz to zrobić między innymi za pomocą funkcji:

- https://php.net/manual/en/function.preg-match.php

lub

- https://php.net/manual/en/function.strpos.php

oczywiście w tym kodzie będzie zbędny fragment "var_dump($http_response_header[0]);"

Bardziej uniwersalnie będzie przejść przez tablice $http_response_header funkcja foreach gdyż IMHO w wypadku $http_response_header nie znamy konkretnego położenie interesujących nas wartości w tablicy

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Ok rozwiązałem to w ten sposób

$url = "https://.......com/".$id.".jpg";
$dir = "/home/jaclaw/domains/.......pl/public_html/prod/img".$id.".jpg";

file_get_contents($url);
$a = implode('/', $http_response_header);
$findme   = '404 Not Found';

$pos = strpos($a, $findme);

if ($pos === false) {
echo $id." - plik dobry <br> \n";
file_put_contents($dir, file_get_contents($url ));
} else {
echo $id." - plik <strong>zły</strong> <br> \n";
}

Zadziałało. Musiałem jednak porcjować po 100 rekordów i puszczać skrypt 10 razy bo inaczej zbyt długo chodził i 500 wywalało.

Dzięki wielkie Mion za naprowadzenie i wyjaśnienia! :hello:

Drukarka przestaje już drukować? Kup tusze i tonery na inkhouse.pl !

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności