如何在CF7中获取上传文件URL并通过PHP写入FTP的TXT文件
解决Contact Form 7上传文件URL获取问题
核心原因:CF7的
$data数组中,上传字段存储的是临时文件名/表单提交的原始文件名,并非文件的永久访问URL。需要通过CF7的表单提交实例对象获取上传文件的实际存储路径,再转换为可访问的URL。实现步骤:
- 在
wpcf7_before_send_mail钩子中,获取CF7的提交实例WPCF7_Submission。 - 通过实例的
uploaded_files()方法,提取对应字段的上传文件服务器路径。 - 用
wp_get_upload_dir()将服务器路径转换为站点可访问的URL。 - 将URL与其他字段内容拼接后写入TXT文件。
- 在
示例代码:
add_action( 'wpcf7_before_send_mail', 'cf7_save_data_to_ftp_txt' ); function cf7_save_data_to_ftp_txt( $contact_form ) { // 获取表单提交实例 $submission = WPCF7_Submission::get_instance(); if ( ! $submission ) return; $data = $submission->get_posted_data(); $uploaded_files = $submission->uploaded_files(); // 获取所有上传文件的路径数组 // 处理目标上传字段(file-799) $file_url = ''; if ( isset( $uploaded_files['file-799'] ) && ! empty( $uploaded_files['file-799'] ) ) { $file_path = $uploaded_files['file-799']; // 转换服务器路径为站点URL $upload_dir = wp_get_upload_dir(); $file_url = str_replace( $upload_dir['basedir'], $upload_dir['baseurl'], $file_path ); } // 拼接要写入的内容(根据你的现有字段调整) $content = "姓名: " . $data['your-name'] . "\n"; $content .= "邮箱: " . $data['your-email'] . "\n"; $content .= "上传文件URL: " . $file_url . "\n"; // 以下保留你原有的FTP写入逻辑即可 $ftp_server = '你的FTP服务器地址'; $ftp_user = 'FTP用户名'; $ftp_pass = 'FTP密码'; $remote_file = '/远程服务器存储路径/表单数据.txt'; $conn_id = ftp_connect( $ftp_server ); $login_result = ftp_login( $conn_id, $ftp_user, $ftp_pass ); if ( $conn_id && $login_result ) { $temp_file = tmpfile(); fwrite( $temp_file, $content ); fseek( $temp_file, 0 ); ftp_fput( $conn_id, $remote_file, $temp_file, FTP_ASCII ); fclose( $temp_file ); ftp_close( $conn_id ); } }
- 注意事项:
- 确保CF7后台已开启文件上传功能,并设置了允许的文件类型、大小限制。
- 上传文件默认存储在
wp-content/uploads/wpcf7_uploads/目录,uploaded_files()返回的是该文件的服务器绝对路径。 - 如果需要追加写入而不是覆盖文件,需调整FTP写入逻辑,先读取远程文件内容再拼接新内容。
内容的提问来源于stack exchange,提问作者PierPaolo
相关产品推荐
相关产品推荐

