PHP - 将CSV导出到FTP而不是在浏览器中下载

时间:2013-07-01 09:34:47

标签: php ftp

我已经尝试了几个小时但现在无济于事。我已使用以下方法在浏览器中成功输出我的CSV:

header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=".$csv_filename."");

但是我希望现在输出转到FTP服务器,我已经将连接和临时文件部分排序,但似乎无法编辑文件以输出我的结果。

// create empty variable to be filled with export data
$csv_export = '';

for($i = 0; $i < $field; $i++) {
$csv_export.= mysql_field_name($query,$i).',';
}
// newline (seems to work both on Linux & Windows servers)
$csv_export.= '
';

// loop through database query and fill export variable
while($row = mysql_fetch_array($query)) {
// create line with field values
for($i = 0; $i < $field; $i++) {
$csv_export.= '"'.$row[mysql_field_name($query,$i)].'",';
}   
$csv_export.= '
';  
}

上面是获取查询数据并将其放入CSV的部分,我尝试在循环中合并fput和fputcsv以将行写入文件。

//Upload the temporary file to server
ftp_fput($ftpstream, '/httpdocs/.../abandoned.csv', $temp, FTP_ASCII);

$fp = fopen('var/www/vhosts/.../abandoned.csv', 'w');
fputs($fp, '$csv_export');
fclose($fp);
echo($csv_export);

因此,回显输出工作绝对正常 - 我想要的是将回波数据写入CSV文件并上传到FTP。

我得到的错误是:

Array ( [type] => 2 [message] => fclose() expects parameter 1 to be resource, 
boolean given

所以fp导致问题......是在开放阶段还是在编写csv_export?

提前致谢。

5 个答案:

答案 0 :(得分:1)

试试这个

//Write the contents to the temp file
fputs($temp, $csv_export);

//upload the temp file
ftp_fput($ftpstream, '/httpdocs/.../abandoned.csv', $temp, FTP_ASCII);

//close the temp file
fclose($temp);

您当前的代码正在创建一个空文件,上传它,然后创建一个单独的文件。即使你让它在本地服务器上运行,也是一个不必要的步骤。

答案 1 :(得分:0)

试试这个,未经测试:

$filename = 'abandoned.csv';
$content  = $csv_export;

$host     = 'yourhost';
$user     = 'youruser'; 
$password = 'yourpass';

//open connection to your ftp server
$stream = stream_context_create(array('ftp' => array('overwrite' => true)));

//authenticate to your ftp server, normal uri syntax
$uri = sprintf('ftp://%s:%s@%s/%s', $user, $password, $host, $filename);
file_put_contents($uri, $content, 0, $stream);

答案 2 :(得分:0)

phpinfo();中,您可以查找Registered PHP Streams,并在大多数情况下使用此功能:

file_put_contents('ftp://user:password@server/your/directory/file.csv', $csvData);

答案 3 :(得分:0)

ftp_fput是正确的方法。

但您必须先准备好FTP连接并进行身份验证。假设你在内存中有$csv_export个字符串:

// connect
$ftp_conn = ftp_connect('ftp.yourserver.net');

// authenticate
$login_result = ftp_login($conn_id, 'ftp_username', 'password');

// prepare output stream
$stream = fopen('data://text/plain,' . $csv_export, 'r');

// try to upload
if (ftp_fput($ftp_conn, '/httpdocs/.../abandoned.csv', $stream, FTP_ASCII)) {
    echo "Successfully uploaded\n";
} else {
    echo "There was a problem while uploading\n";
}

// close the connection and the file handler
ftp_close($ftp_conn);
fclose($stream);

答案 4 :(得分:0)

您收到该错误,因为fopen返回false,表示无法打开该文件。

如果我正在理解您的代码,那么在$ temp打开它之后,您就会将abandoned.csv(可能存在)上传到ftp。 $ temp指向您本地的abandon.csv副本吗?因为如果是这样,你应该在用fopen打开第二个文件流之前关闭指向它的文件流。

如果那不是问题,那么abandoned.csv可能实际上不存在,在这种情况下,您可能只是试图打开丢失的文件。