Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在不使用主机带宽传输的情况下从另一个FTP主机读取文件_Php_Ftp - Fatal编程技术网

Php 如何在不使用主机带宽传输的情况下从另一个FTP主机读取文件

Php 如何在不使用主机带宽传输的情况下从另一个FTP主机读取文件,php,ftp,Php,Ftp,我有一个存储数据的主机和一个下载主机(这个主机没有数据库)。我想从存储主机中的下载主机中读取一个文件,并将其交给用户下载,但我不想在用户下载文件时使用存储主机的每月带宽传输,而只是使用下载主机带宽传输 我知道有两种方法: ftp\u获取下载文件并将其保存在本地文件中,然后设置头以供下载。我不想使用这种方式,因为下载文件在商店主机 // in store host $local_file = 'app.apk'; $ftp_file = '/uploads/2015/06/1eb6a628c60b

我有一个存储数据的主机和一个下载主机(这个主机没有数据库)。我想从存储主机中的下载主机中读取一个文件,并将其交给用户下载,但我不想在用户下载文件时使用存储主机的每月带宽传输,而只是使用下载主机带宽传输

我知道有两种方法:

  • ftp\u获取
    下载文件并将其保存在本地文件中,然后设置
    以供下载。我不想使用这种方式,因为下载文件在商店主机

    // in store host
    $local_file = 'app.apk';
    $ftp_file = '/uploads/2015/06/1eb6a628c60bb69a6b6092d03e252c29.apk';
    // download file and save it in local
    ftp_get($conn_id , $local_file, $ftp_file, FTP_BINARY);
    
    $file_name = 'app.apk';
    $file_size = filesize($local_file);
    
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . $file_name);
    header('Content-Transfer-Encoding: binary');
    header('Connection: Keep-Alive');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . $file_size);
    
    readfile($local_file);
    
  • 我不知道用户是否下载文件时
    文件\u获取\u内容
    使用存储主机的带宽传输

    // in store host
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . $file_name);
    header('Content-Transfer-Encoding: binary');
    header('Connection: Keep-Alive');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . $file_size);
    
    // readfile($local_file);
    
    $c = file_get_contents('ftp://login:pass@download-host.com/uploads/2015/06/app.apk');
    echo $c;
    

  • 我不想在存储主机中使用带宽传输;我可以走哪条路?方式2或其他方式?

    如果不向客户提供下载所需的所有信息(“下载链接”),就无法将内容从“下载主机”直接下载到客户机

    如果需要对客户端隐藏下载信息,则需要在“存储主机”上下载文件,然后将其转发给客户端。因此,您正在使用“存储主机”的带宽数据。不管你使用什么技术、协议或功能。以及
    ftp\u get
    file\u get\u内容(“ftp://...“”
    无论如何都要使用相同的代码


    简单地说,既不能从客户端隐藏下载信息,也不能不使用“存储主机”的带宽数据。

    您每次都在尝试将数据下载到存储主机。然后将其转发给用户。这样,您将始终使用存储主机带宽。。。。客户端应该直接从下载主机下载。但我不想给所有用户提供下载链接,当用户开始下载时,我会在数据库中保存一些数据。谢谢。然后我应该在“下载主机”中创建一个下载页面,然后创建一个类似“download host.com?file=dlkodkdo.apk”的链接,然后用
    curl
    将一些数据发送到“存储主机”,并设置要下载的头文件和读取文件:),这样更好。