Hiányos, nem teljes fájl letöltése php curl-al
2021-03-23T03:20:47+01:00
2021-04-07T00:28:46+02:00
2022-08-12T01:55:31+02:00
richi4100
Sziasztok,

az alábbi függvényt hazsnálva próbálok fájlokat letölteni, de minden esetben nagyon hiányosan
töltődnek le a fájlok, azaz a letöltött fájl mérete nem egyezik meg a szerveren tárolt fájl méretével.

function download_file_from_url($url, $Directory){ $remoteFile = $url; $curl = curl_init($remoteFile); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HEADER, true); curl_setopt($curl, CURLOPT_NOBODY, true); curl_setopt($curl, CURLOPT_TIMEOUT, 3000); curl_setopt($curl, CURLOPT_INFILESIZE, filesize($remoteFile)); curl_exec($curl); print_r(curl_getinfo($curl)); //Retrieve the size of the remote file in bytes. $fileSize = curl_getinfo($curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD); var_dump($fileSize); //Convert it into KB $fileSizeKB = round($fileSize / 1024); echo 'File is ' . $fileSizeKB . ' KB in size.<br />'; $DownloadDir = str_replace(']',')',str_replace('[','(',$Directory.urldecode(explode("?",explode("/",$remoteFile)[4])[0]))); $fp = fopen($DownloadDir, "w"); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET"); curl_setopt($curl, CURLOPT_URL, $remoteFile); curl_setopt($curl, CURLOPT_FILE, $fp); curl_exec($curl);
}

És ahogy használom, meghívom:

foreach ($linkek as $urls){ //print_r($urls); $download_url = generate_url($urls); download_file_from_url($download_url,"C:/xampp/htdocs/UC1/".$s2."/"); }
Ahol a $download_url tartalmazza a fájlokhoz vezető teljes url-t. A letöltés látszólag megtörténik, de a fájlok mérete nem valós.....

Van ötletetek mit rontok el?

Köszönöm a segítséget előre is.

A fájlok mérete minden esetben 845 - 850 Byte között megáll))
Mutasd a teljes hozzászólást!
Egy kis mankó, működő kódból kiszedve:

private function httpGet($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5); $data = curl_exec($curl); curl_close($curl); return $data; }
A mentés pedig:

if (($res = $this->httpGet($url))): if (@file_put_contents(DIR_IMAGE . ($fn = 'products/' . ($name = strtolower(pathinfo($url, PATHINFO_FILENAME))) . '.tmp'), $res)): switch (@exif_imagetype(DIR_IMAGE . $fn)): case IMAGETYPE_GIF: $locimg = 'products/' . $name . '.gif'; break; case IMAGETYPE_JPEG: $locimg = 'products/' . $name . '.jpg'; break; case IMAGETYPE_PNG: $locimg = 'products/' . $name . '.png'; break; endswitch; if ((!empty($locimg)) && rename(DIR_IMAGE . $fn, DIR_IMAGE . $locimg)): $return = $locimg; else: unlink(DIR_IMAGE . $fn); endif; endif;
Ez az esetleg 0 bájtos hibásan letöltött képeket sem tartja meg.
Mutasd a teljes hozzászólást!

  • Szerintem ez nem kell:

    curl_setopt($curl, CURLOPT_INFILESIZE, filesize($remoteFile));
    Ennek csak feltöltéskor van értelme, letöltéskor minek? A második blokkban (amikor elmentenéd a helyi fájlrendszerbe) miért kell cURL? Használd a file_put_contents() függvényt, amibe az első curl_exec() kimenetét mented el (hiszen az maga a letöltött fájl adattartalma).
    Mutasd a teljes hozzászólást!
  • Egy kis mankó, működő kódból kiszedve:

    private function httpGet($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5); $data = curl_exec($curl); curl_close($curl); return $data; }
    A mentés pedig:

    if (($res = $this->httpGet($url))): if (@file_put_contents(DIR_IMAGE . ($fn = 'products/' . ($name = strtolower(pathinfo($url, PATHINFO_FILENAME))) . '.tmp'), $res)): switch (@exif_imagetype(DIR_IMAGE . $fn)): case IMAGETYPE_GIF: $locimg = 'products/' . $name . '.gif'; break; case IMAGETYPE_JPEG: $locimg = 'products/' . $name . '.jpg'; break; case IMAGETYPE_PNG: $locimg = 'products/' . $name . '.png'; break; endswitch; if ((!empty($locimg)) && rename(DIR_IMAGE . $fn, DIR_IMAGE . $locimg)): $return = $locimg; else: unlink(DIR_IMAGE . $fn); endif; endif;
    Ez az esetleg 0 bájtos hibásan letöltött képeket sem tartja meg.
    Mutasd a teljes hozzászólást!
  • Ellenőrizted hogy a szkript végigfut? Elvileg alapból a maximum az 30 másodperc.

    PHP: set_time_limit - Manual
    Mutasd a teljes hozzászólást!
  • Köszönöm!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd