我已经尝试了几个小时但现在无济于事。我已使用以下方法在浏览器中成功输出我的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?
提前致谢。
答案 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可能实际上不存在,在这种情况下,您可能只是试图打开丢失的文件。