如何使用PHP通过ftp上传文件?

3

我有一个包含HTML浏览器类型和提交按钮的表单。我使用浏览按钮选择一个文件并提交表单。在表单提交时,会调用以下代码。

$conn_id="myid";
$conn_id = ftp_connect ( 'server' );
$ftp_user_name="username";
$ftp_user_pass="password";

// login with username and password
$login_result = ftp_login ( $conn_id , $ftp_user_name , $ftp_user_pass );

// check connection
if ((! $conn_id ) || (! $login_result )) {
    echo "FTP connection has failed!" ;
    exit;

} else {
    echo "Connected to for user $ftp_user_name" ;
} 

// upload the file
$upload = ftp_put( $conn_id, "images/signatures/" . $fileName , $_FILES['tmp_name'] , FTP_BINARY );

// check upload status
if(!$upload){
    echo "FTP upload has failed!" ;
} else {
    echo "Successfully Uploaded." ;
}

但它会产生以下警告:
Warning: ftp_put(): Filename cannot be empty in /var/www/echdp/_ProviderSignature.php on line 70 FTP upload has failed!

但是,当我在上述代码中硬编码源路径时,它会将文件上传到服务器:

$upload = ftp_put( $conn_id, "images/signatures/myfile.txt" , "/var/www/images/hello.txt" , FTP_BINARY );

1
你确定你的HTML表单有属性 enctype='multipart/form-data' 吗?否则,$_FILES 数组将不会被填充,你会看到你正在遇到的错误。 - JCD
4个回答

3

试试这个:

$file = 'somefile.txt';
$remote_file = '/public_html/dir/dir2/dir3/somefile.txt';
$ftp_server = "yourdomain.in";
$ftp_user_name = "ftpusername";
$ftp_user_pass = "ftppassword";

// set up basic connection
$conn_id = ftp_connect($ftp_server);

// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// upload a file
if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) {
 echo "successfully uploaded $file\n";
} else {
 echo "There was a problem while uploading $file\n";
}

// close the connection
ftp_close($conn_id);

您的文件将上传至您的域名的/public_html/dir/dir2/dir3/目录下。
注意:测试此功能时,永远不要上传索引文件。
来源:PHP.net


2

带有enctype的html代码示例:

<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="myfile" id="file" /> 
<br />
<input type="submit" name="submit" value="Submit" />
</form>

您的 Form 标签中是否有 enctype 属性?如果没有该属性,您的文件将无法发送。

调试 $_FILES 数组时,请尝试:

var_dump($_FILES);

检查数据是否正确。

您的变量:

$_FILES['tmp_name'] 

这段代码使用不当,因为$_FILES变量包含多个文件而不是单个文件。因此,你应该写成:

$_FILES['your-name-in-html-form']['tmp_name'] // your-name-in-html-form = myfile in the example above

请看示例:http://www.zymic.com/tutorials/php/creating-a-file-upload-form-with-php/

2
$_FILES['tmp_name'] 

您的文件名不是“isn't”,它存储在以下位置:
$_FILES['inputname']['tmp_name']

其中inputname是您字段的名称。还要检查您的表单是否为enctype ="multipart/form-data"。

请注意,不要简单地将用户可以发送的所有内容放在服务器上 - 如果可以通过HTTP访问上传的文件(如http://yoursite/images/signatures/uploadedfile.xxx),有人可能会在您的服务器上放置.php文件并执行它!


1

显然,$_FILES ['tmp_name'] 不包含文件名。尝试使用 print_r($_FILES) 查看其包含的内容。此外,请使用 multipart/form-data 作为您的表单 enctype。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接