Загрузите файл прямо на live server & ldquo; public_html / downloads & rdquo; каталог, а не в локальной системе с php-кодом? [Дубликат]

C99 N1256 draft

Существует два совершенно разных применения литералов массива:

  1. Инициализировать char[]:
    char c[] = "abc";      
    
    Это «более волшебное» и описано при 6.7.8 / 14 «Инициализация»: массив типа символа может быть инициализирован литералом строки символов, необязательно заключенным в фигурные скобки. Последовательные символы символьного строкового литерала (включая завершающий нулевой символ, если есть место или массив неизвестного размера) инициализируют элементы массива. Таким образом, это просто сокращение для:
    char c[] = {'a', 'b', 'c', '\0'};
    
    Как и любой другой регулярный массив, c может быть изменен.
  2. Всюду: он генерирует: неназванный массив char . Каков тип строковые литералы в C и C ++? со статическим хранилищем, которое дает UB, если оно изменено. Итак, когда вы пишете:
    char *c = "abc";
    
    Это похоже на:
    /* __unnamed is magic because modifying it gives UB. */
    static char __unnamed[] = "abc";
    char *c = __unnamed;
    
    Обратите внимание на неявный листинг с char[] на char *, который всегда законным. Затем, если вы измените c[0], вы также измените __unnamed, который является UB. Это описано в разделе 6.4.5 «Строковые литералы»: 5 В фазе 7 перевода байт или код нулевого значения добавляется к каждой многобайтовой последовательности символов, которая получается из строкового литерала или литералов. Последовательность многобайтовых символов затем используется для инициализации массива статической продолжительности хранения и длины, достаточной для того, чтобы содержать последовательность. Для символьных строковых литералов элементы массива имеют тип char и инициализируются отдельными байтами многобайтовой последовательности символов [...] 6 Не определено, являются ли эти массивы различными, если их элементы имеют соответствующие значения. Если программа пытается изменить такой массив, поведение не определено.

6.7.8 / 32 «Инициализация» дает прямой пример:

ПРИМЕР 8: Объявление

char s[] = "abc", t[3] = "abc";

определяет «простые» объекты массива char s и t, элементы которых инициализируются символами строковых символов.

Это объявление идентично

char s[] = { 'a', 'b', 'c', '\0' },
t[] = { 'a', 'b', 'c' };

Содержимое массивов изменяемый. С другой стороны, объявление

char *p = "abc";

определяет p с типом «указатель на символ» и инициализирует его, указывая на объект с типом «массив символов» с длиной 4, элементы которого инициализируются с символьным строковым литералом. Если попытается использовать p для изменения содержимого массива, поведение не определено.

blockquote>

GCC 4.8 x86-64 Реализация ELF

Программа:

#include 

int main() {
    char *s = "abc";
    printf("%s\n", s);
    return 0;
}

Скомпилировать и декомпилировать:

gcc -ggdb -std=c99 -c main.c
objdump -Sr main.o

Выход содержит:

 char *s = "abc";
8:  48 c7 45 f8 00 00 00    movq   $0x0,-0x8(%rbp)
f:  00 
        c: R_X86_64_32S .rodata

Заключение: GCC хранит char* в секции .rodata , а не в .text.

Если мы сделаем то же самое для char[]:

 char s[] = "abc";

, получим:

17:   c7 45 f0 61 62 63 00    movl   $0x636261,-0x10(%rbp)

, поэтому он получает хранится в стеке (относительно %rbp).

Обратите внимание, однако, что сценарий компоновщика по умолчанию помещает .rodata и .text в тот же сегмент, который имеет исполнение, но не имеет права на запись. Это можно наблюдать с помощью

readelf -l a.out

, который содержит:

 Section to Segment mapping:
  Segment Sections...
   02     .text .rodata 

271
задан hakre 31 March 2013 в 15:17
поделиться

10 ответов

Попробуйте использовать cURL

set_time_limit(0); // unlimited max execution time
$options = array(
  CURLOPT_FILE    => '/path/to/download/the/file/to.zip',
  CURLOPT_TIMEOUT =>  28800, // set this to 8 hours so we dont timeout on big files
  CURLOPT_URL     => 'http://remoteserver.com/path/to/big/file.zip',
);

$ch = curl_init();
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);

Я не уверен, но я верю, что с параметром CURLOPT_FILE он записывает, когда он извлекает данные, т. е. не буферизировано.

391
ответ дан Community 29 August 2018 в 01:26
поделиться

Начиная с PHP 5.1.0, file_put_contents() поддерживает запись по частям путем передачи дескриптора потока в качестве параметра $data:

file_put_contents("Tmpfile.zip", fopen("http://someurl/file.zip", 'r'));

From руководство:

Если data [это второй аргумент] является ресурсом потока, оставшийся буфер этого потока будет скопирован в указанный файл. Это похоже на использование stream_copy_to_stream() .

(Спасибо Hakre .)

391
ответ дан Community 31 August 2018 в 07:57
поделиться

PHP 4 & amp; 5 Решение:

readfile () не будет вызывать проблем с памятью, даже при отправке больших файлов самостоятельно. URL-адрес может использоваться как имя файла с этой функцией, если обертки fopen были включены.

http://php.net/manual/en/function.readfile.php

4
ответ дан Eric Leroy 29 August 2018 в 01:26
поделиться

Я использую это для загрузки файла

function cURLcheckBasicFunctions()
{
  if( !function_exists("curl_init") &&
      !function_exists("curl_setopt") &&
      !function_exists("curl_exec") &&
      !function_exists("curl_close") ) return false;
  else return true;
}

/*
 * Returns string status information.
 * Can be changed to int or bool return types.
 */
function cURLdownload($url, $file)
{
  if( !cURLcheckBasicFunctions() ) return "UNAVAILABLE: cURL Basic Functions";
  $ch = curl_init();
  if($ch)
  {

    $fp = fopen($file, "w");
    if($fp)
    {
      if( !curl_setopt($ch, CURLOPT_URL, $url) )
      {
        fclose($fp); // to match fopen()
        curl_close($ch); // to match curl_init()
        return "FAIL: curl_setopt(CURLOPT_URL)";
      }
      if ((!ini_get('open_basedir') && !ini_get('safe_mode')) || $redirects < 1) {
        curl_setopt($ch, CURLOPT_USERAGENT, '"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        //curl_setopt($ch, CURLOPT_REFERER, 'http://domain.com/');
        if( !curl_setopt($ch, CURLOPT_HEADER, $curlopt_header)) return "FAIL: curl_setopt(CURLOPT_HEADER)";
        if( !curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $redirects > 0)) return "FAIL: curl_setopt(CURLOPT_FOLLOWLOCATION)";
        if( !curl_setopt($ch, CURLOPT_FILE, $fp) ) return "FAIL: curl_setopt(CURLOPT_FILE)";
        if( !curl_setopt($ch, CURLOPT_MAXREDIRS, $redirects) ) return "FAIL: curl_setopt(CURLOPT_MAXREDIRS)";

        return curl_exec($ch);
    } else {
        curl_setopt($ch, CURLOPT_USERAGENT, '"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        //curl_setopt($ch, CURLOPT_REFERER, 'http://domain.com/');
        if( !curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false)) return "FAIL: curl_setopt(CURLOPT_FOLLOWLOCATION)";
        if( !curl_setopt($ch, CURLOPT_FILE, $fp) ) return "FAIL: curl_setopt(CURLOPT_FILE)";
        if( !curl_setopt($ch, CURLOPT_HEADER, true)) return "FAIL: curl_setopt(CURLOPT_HEADER)";
        if( !curl_setopt($ch, CURLOPT_RETURNTRANSFER, true)) return "FAIL: curl_setopt(CURLOPT_RETURNTRANSFER)";
        if( !curl_setopt($ch, CURLOPT_FORBID_REUSE, false)) return "FAIL: curl_setopt(CURLOPT_FORBID_REUSE)";
        curl_setopt($ch, CURLOPT_USERAGENT, '"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11');
    }
      // if( !curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true) ) return "FAIL: curl_setopt(CURLOPT_FOLLOWLOCATION)";
      // if( !curl_setopt($ch, CURLOPT_FILE, $fp) ) return "FAIL: curl_setopt(CURLOPT_FILE)";
      // if( !curl_setopt($ch, CURLOPT_HEADER, 0) ) return "FAIL: curl_setopt(CURLOPT_HEADER)";
      if( !curl_exec($ch) ) return "FAIL: curl_exec()";
      curl_close($ch);
      fclose($fp);
      return "SUCCESS: $file [$url]";
    }
    else return "FAIL: fopen()";
  }
  else return "FAIL: curl_init()";
}
5
ответ дан Hoàng Vũ Tgtt 29 August 2018 в 01:26
поделиться

Есть 3 способа:

  1. file_get_contents и file_put_contents
  2. CURL
  3. fopen

Вы можете найти примеры здесь .

5
ответ дан Hoan Huynh 29 August 2018 в 01:26
поделиться
private function downloadFile($url, $path)
{
    $newfname = $path;
    $file = fopen ($url, 'rb');
    if ($file) {
        $newf = fopen ($newfname, 'wb');
        if ($newf) {
            while(!feof($file)) {
                fwrite($newf, fread($file, 1024 * 8), 1024 * 8);
            }
        }
    }
    if ($file) {
        fclose($file);
    }
    if ($newf) {
        fclose($newf);
    }
}
114
ответ дан Ibrahim Azhar Armar 29 August 2018 в 01:26
поделиться

Выше приведен пример (продигиталсон) кода wchih не работает (причина: отсутствует fopen в CURLOPT_FILE - http://www.webdeveloper.com/forum/showthread.php?268299-RESOLVED-PHP- script-for-a-cronjob-download-file-unpzck-run-another-php-script ). Я не могу добавить комментарий там, потому что у меня слишком низкое количество очков, поэтому ниже я даю рабочий пример (он также работает для «локального url»):

function downloadUrlToFile($url, $outFileName)
{   
    if(is_file($url)) {
        copy($url, $outFileName); 
    } else {
        $options = array(
          CURLOPT_FILE    => fopen($outFileName, 'w'),
          CURLOPT_TIMEOUT =>  28800, // set this to 8 hours so we dont timeout on big files
          CURLOPT_URL     => $url
        );

        $ch = curl_init();
        curl_setopt_array($ch, $options);
        curl_exec($ch);
        curl_close($ch);
    }
}
14
ответ дан Kamil Kiełczewski 29 August 2018 в 01:26
поделиться
  1. Создайте папку с именем «downloads» на целевом сервере
  2. Сохраните [этот код] в файл .php и запустите на целевом сервере

Downloader :

<html>
<form method="post">
<input name="url" size="50" />
<input name="submit" type="submit" />
</form>
<?php
    // maximum execution time in seconds
    set_time_limit (24 * 60 * 60);

    if (!isset($_POST['submit'])) die();

    // folder to save downloaded files to. must end with slash
    $destination_folder = 'downloads/';

    $url = $_POST['url'];
    $newfname = $destination_folder . basename($url);

    $file = fopen ($url, "rb");
    if ($file) {
      $newf = fopen ($newfname, "wb");

      if ($newf)
      while(!feof($file)) {
        fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
      }
    }

    if ($file) {
      fclose($file);
    }

    if ($newf) {
      fclose($newf);
    }
?>
</html> 
18
ответ дан pascalhein 29 August 2018 в 01:26
поделиться

Использовать простой метод в php copy()

copy($source_url, $local_path_with_file_name);

Примечание: если файл назначения уже существует, он будет перезаписан

PHP copy () Функция

Специальное примечание. Не забудьте установить разрешение 777 для целевой папки

4
ответ дан Pradeep Kumar Prabaharan 29 August 2018 в 01:26
поделиться
set_time_limit(0); 
$file = file_get_contents('path of your file');
file_put_contents('file.ext', $file);
12
ответ дан Vijaysinh Parmar 29 August 2018 в 01:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: