Загрузка файла с помощью функции php

#php #forms #email

#php #формы #Адрес электронной почты

Вопрос:

Я пытаюсь загрузить файл с веб-сервера, используя функцию php. Эта функция является частью скрипта, который я написал, прикрепленного к форме. Моя цель — после того, как пользователь нажмет кнопку отправки, файл будет загружен через их браузер. Мой код для формы отправляет все заполненные данные на адрес электронной почты и отправляет клиенту электронное письмо с уведомлением о подтверждении, этот код работает и не имеет каких-либо известных ошибок. Я могу загрузить файл со своего сервера, используя следующий php-скрипт:

 <?php
$name = 'Automated_Drones.pdf';
$fp = fopen($name, 'rb');
header("Content-Type: application/pdf");
header("Content-Length: " . filesize($name));
fpassthru($fp);
?>
  

Но когда я пытаюсь поместить этот скрипт в функцию и вызвать эту функцию с помощью моего скрипта электронной почты формы, похоже, он не работает. Я могу создавать произвольные сценарии и помещать приведенный выше код в функцию и вызывать ее, и она работает нормально. Но когда я пробую это с помощью моего скрипта электронной почты form, он вообще не работает. Я регистрирую ошибки во всех своих сценариях, и никаких ошибок не возникает в том, что у меня есть на данный момент. Электронные письма отправляются на адрес, указанный в форме, а второй адрес электронной почты получает его данные, поэтому я уверен, что это не проблема. Вот мой последний скрипт, который я пытался заставить работать:

 <?php 
global $_REQUEST, $wpdb;
$response = array('error'=>'');

$user_exp = test_input($_REQUEST['user_exp']);
$user_name = test_input(substr($_REQUEST['user_name'], 0, 20));
$user_surname = test_input($_REQUEST['user_surname']);
$user_title = test_input($_REQUEST['user_title']);
$user_industry = test_input($_REQUEST['user_industry']);
$user_email = test_input(substr($_REQUEST['user_email'], 0, 40));
$user_phone = test_input($_REQUEST['user_phone']);

//Download functions are run here, i comment out the functions im not using
//downloadFile();
//curl_get_file_contents('Automated_Drones.pdf');
downloadFile_new();

$contact_email = 'airobotics@XXXXXX.com.au';
$reply_msg = 'Thank you for downloading the airobotics latest white paper, if you did not receive the white paper upon completing your form please contact airobotics@xxxx.com.au for assistance';
$sub_us = 'Airobotics From Details from :$user_email';
$sub_user = 'Airobotics white paper brought to you by National Resources Review';
if (trim($contact_email)!='') {
$msg = "rn Name: $user_name rn Surname: $user_surname rn Title: $user_title rn Industry: $user_industry rn  E-mail: $user_email rn Phone: $user_phone rn Drone Experience Type: $user_exp";
$head = "Content-Type: text/plain; charset="utf-8"n"
. "X-Mailer: PHP/" . phpversion() . "n"
. "Reply-To:airobotics@XXXXX.com.aun"
. "To: $user_emailn"
. "From: $contact_emailn";
$head_details = "Content-Type: text/plain; charset="utf-8"n"
. "X-Mailer: PHP/" . phpversion() . "n"
. "Reply-To:info@XXXXX.com.aun"
. "To: $contact_email"
. "From: no-reply@XXXXXX.com.aun";
mail($contact_email, $sub_us, $msg, $head_details);
if (!@mail($user_email, $sub_user, $reply_msg, $head)) {
$response['error'] = 'Error send message!';
}
} else 
$response['error'] = 'Error send message!';
echo json_encode($response);
die();

//Test Form Data
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}

//First Download Function tried
function downloadFile()
{
$name = 'Automated_Drones.pdf';
$fp = fopen($name, 'rb');
// send the right headers
header("Content-Type: application/pdf");
header("Content-Length: " . filesize($name));
fpassthru($fp);
}
//Second Download Function Tried

function curl_get_file_contents($URL) {
$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($c, CURLOPT_URL, $URL);
$contents = curl_exec($c);
$err  = curl_getinfo($c,CURLINFO_HTTP_CODE);
curl_close($c);
if ($contents) return $contents;
else return FALSE;
}

//Thrid Download Function Tried
function downloadFile_new() {
$file_url = 'http://XXXXXX.com.au/Automated_Drones.pdf';
header('Content-Type: application/pdf');
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename="" . basename($file_url) . """); 
readfile($file_url); // do the double-download-dance (dirty but worky)
}
?>
  

Комментарии:

1. Вы действительно уверены, что не получили никаких сообщений об ошибках? Вы действительно просматривали файл журнала ошибок своих http-серверов?

2. О, с функциями загрузки файлов я это сделал, но при рассылке по электронной почте я не получил ошибок PHP

3. Что вы имеете в виду под этим? Вы нашли сообщения об ошибках в файле журнала ошибок? Итак, что это такое?

4. Извините, я пропустил формулировку последнего комментария. Я не нашел ошибок PHP при использовании этих функций. Я использовал их только по отдельности для этого скрипта электронной почты. Я убедился, что все они работают, создавая отдельные скрипты и тестируя их по отдельности. Итак, да, последней известной ошибкой, которую я получил, была синтаксическая ошибка, но это было только потому, что я пропустил скобку в последней функции

5. Может быть, я убиваю скрипт в неподходящее время

Ответ №1:

изменить:

 else 
    $response['error'] = 'Error send message!';
    echo json_encode($response);
    die();
  

Для:

 else{ 
    $response['error'] = 'Error send message!';
    echo json_encode($response);
    die();
}
  

также попробуйте вызвать вашу downloadFile_new функцию в конце вашего скрипта. Возможно, вы столкнулись с проблемой выходного буфера

Комментарии:

1. Спасибо даст этому шанс

2. С первым внесенным изменением кажется, что электронные письма отправляются, но сообщение с подтверждением не отображается. Я уверен, что это потому, что он будет отображаться только в случае ошибки в форме или при передаче по электронной почте. Сейчас я попробую вашу другую рекомендацию

3. Добавление функции в конце не помогло : (

4. вы пробовали вставлять a var_dump() в разные точки своего кода, чтобы увидеть, где происходит сбой. кроме того, насколько велик файл, для которого вы пытаетесь вызвать readfile функцию? Я знаю, что для файлов большего размера эта функция не будет работать.

5. Нет, я еще не пробовал это, но я попробую использовать var_dump() , чтобы посмотреть, работает ли это. Я пробовал использовать echo , но это мне ничего не показывает

Ответ №2:

Спасибо за помощь, ребята. К сожалению, после долгих исследований я не нашел простого способа добиться этого, поэтому в качестве более простой альтернативы я решил добавить вторую кнопку, которая отображается при успешной отправке формы