2016-11-08 53 views
1

在我的php restful api上运行一个heroku dyno,因为我的api接受用户上传文件视图($ _FILES)-form post-我需要将上传的文件转发到我的ftp服务器以保留它们,因为heroku没有存储空间。哪一个更可靠在PHP ftp_connect vs file_put_content(ftp://)

我用Google搜索周围找到实现这一目标的最佳途径,发现两种方法

代码示例显示两种方法

// common code: 
$tmp_file_path = $_FILES['image']['tmp_name']; 
$raw_filename = explode('.',$_FILES['image']['name']); 
$extention = array_pop($raw_filename); 
$filename = md5(implode('.',$raw_filename)).$extention; 

// 1st: ftp_put_content; 
$content = file_get_contents($tmp_file_path); 
// additional stream is required as per http://php.net/manual/en/function.file-put-contents.php#96217 
$stream = stream_context_create(['ftp' => ['overwrite' => true]]); 
$upload_success = file_put_content('ftp://username:[email protected]/'+$filename, $content, 0, $stream); 

// 2nd: ftp_put 
$conn_id = ftp_connect("ftp.simpleinformatics.com"); 
$login_result = ftp_login($conn_id, "username", "password"); 
ftp_pasv($conn_id, true); //for somereason my ftp serve requires this ! 
if (!$conn_id OR !$login_result) $upload_success = false; 
$ftp_upload_success = ftp_put($conn_id,'/'.$filename, $tmp_file_path); 

echo "file_put_content" . ($upload_success ? "upload success" : 'file upload failed'); 

echo "ftp_put" . ($ftp_upload_success ? "upload success" : 'file upload failed'); 

我的两种方法是测试对我的FTP服务器和两个工作但我担心可靠性,关于两种方法如何工作的细节,很少有文档,所以我不确定夫妇的事情。

  1. 我可以在使用ftp文件时使用file_put_content标志吗?像FILE_APPEND或LOCK_EX?
  2. 如果上传到尚不存在的文件夹会发生什么情况?
  3. 哪种方法更可靠,更不容易失败?
  4. 虽然file_put_contents不太详细,但我们需要在写入之前先读取文件内容,这是否会导致内存问题?
+1

没有阅读大部分帖子,但通过标题,我会说'ftp_ *'函数更可靠,因为这些协议的文件包装可以被禁用。 –

+0

@JonStirling如果不存在,ftp_ *处理file_append /文件锁定/创建目录? – Zalaboza

回答