1

在我在 heroku dyno 上运行的 php restful api 中,因为我的 api 接受用户上传文件视图 ($_FILES) -form post- 我需要将上传的文件转发到我的 ftp 服务器以保存它们,因为 heroku 没有存储空间。

我四处搜索以找到实现这一目标的最佳方法,并找到了两种方法

代码示例显示这两种方法

// 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:password@ftpserver.com/'+$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. 放入 ft​​p 文件时可以使用 file_put_content 标志吗?像 FILE_APPEND 或 LOCK_EX ?
  2. 如果上传到尚不存在的文件夹会发生什么?
  3. 哪种方法更可靠,更不容易失败?
  4. 虽然 file_put_contents 不那么冗长,但我们需要在写入之前先读取文件内容,这会导致内存问题吗?
4

1 回答 1

0
  1. 自 PHP 5 起,FTP URL 包装器支持附加:
    https ://www.php.net/manual/en/wrappers.ftp.php#refsect1-wrappers.ftp-options
  2. 使用任何方法都没有创建 FTP 文件夹。你必须自己处理。
  3. 太宽泛。
  4. 不清楚。
于 2016-11-08T12:53:34.743 回答