0

添付ファイルを操作するフォームを取得しました。これはphpコードです

<?php

    //we need to get our variables first

    $email_to =   'xemax@tiscalinet.it'; //the address to which the email will be sent
    $name     =   $_POST['name'];  
    $email    =   $_POST['email'];
    $subject  =   "www.goliaerrante.com";
    $message  =   'Nome: '.$_POST['name'].chr(10) . chr(10) . 
                  'Email: '.$_POST['email'].chr(10) . chr(10) .
                  'Telefono: '.$_POST['subject'].chr(10) . chr(10) .
                  'Messaggio: '.$_POST['message'];


$allegato = $_FILES['allegato']['tmp_name'];
$allegato_type = $_FILES['allegato']['type'];
$allegato_name = $_FILES['allegato']['name'];


$msg = "";
$headers = "From: " . $email;


// Verifico se il file è stato caricato correttamente via HTTP
// In caso affermativo proseguo nel lavoro...
if (is_uploaded_file($allegato))
{
  // Apro e leggo il file allegato
  $file = fopen($allegato,'rb');
  $data = fread($file, filesize($allegato));
  fclose($file);

  // Adatto il file al formato MIME base64 usando base64_encode
  $data = chunk_split(base64_encode($data));

  // Genero il "separatore"
  // Serve per dividere, appunto, le varie parti del messaggio.
  // Nel nostro caso separerà la parte testuale dall'allegato
  $semi_rand = md5(time());
  $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";

  // Aggiungo le intestazioni necessarie per l'allegato
  $headers .= "\nMIME-Version: 1.0\n";
  $headers .= "Content-Type: multipart/mixed;\n";
  $headers .= " boundary=\"{$mime_boundary}\"";

  // Definisco il tipo di messaggio (MIME/multi-part)
  $msg .= "This is a multi-part message in MIME format.\n\n";

  // Metto il separatore
  $msg .= "--{$mime_boundary}\n";

  // Questa è la parte "testuale" del messaggio
  $msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
  $msg .= "Content-Transfer-Encoding: 7bit\n\n";
  $msg .= $message . "\n\n";

  // Metto il separatore
  $msg .= "--{$mime_boundary}\n";

  // Aggiungo l'allegato al messaggio
  $msg .= "Content-Disposition: attachment;\n";
  $msg .= " filename=\"{$allegato_name}\"\n";
  $msg .= "Content-Transfer-Encoding: base64\n\n";
  $msg .= $data . "\n\n";

  // chiudo con il separatore
  $msg .= "--{$mime_boundary}--\n";
}
else
{
  $msg = $message;
}




// Invio la mail
if (mail($email_to,  $subject, $msg, $headers))
{
  echo 'sent'; // we are sending this text to the ajax request telling it that the mail is sent.. 
}else{
  echo 'failed';// ... or this one to tell it that it wasn't sent    
}
?>

メッセージの結果を処理するために、この JavaScript を適応させようとしています。JavaScriptを使用しない場合、すべて正常に動作します.JavaScriptを使用すると、添付ファイルなしで電子メールのみが送信されます..

$(document).ready(function(){  
    $('#send_message').click(function(e){  

        //stop the form from being submitted  
        e.preventDefault();  

        /* declare the variables, var error is the variable that we use on the end 
        to determine if there was an error or not */  
        var error = false;  
        var name = $('#name').val();  
        var email = $('#email').val();  
        var subject = $('#subject').val();  
        var message = $('#message').val();  

        /* in the next section we do the checking by using VARIABLE.length 
        where VARIABLE is the variable we are checking (like name, email), 
        length is a javascript function to get the number of characters. 
        And as you can see if the num of characters is 0 we set the error 
        variable to true and show the name_error div with the fadeIn effect. 
        if it's not 0 then we fadeOut the div( that's if the div is shown and 
        the error is fixed it fadesOut. 

        The only difference from these checks is the email checking, we have 
        email.indexOf('@') which checks if there is @ in the email input field. 
        This javascript function will return -1 if no occurence have been found.*/  
        if(name.length == 0){  
            var error = true;  
            $('#name_error').fadeIn(300);  
        }else{  
            $('#name_error').fadeOut(300);  
        }  
        if(email.length == 0 || email.indexOf('@') == '-1'){  
            var error = true;  
            $('#email_error').fadeIn(300);  
        }else{  
            $('#email_error').fadeOut(300);  
        }  
        if(subject.length == 0){  
            var error = true;  
            $('#subject_error').fadeIn(300);  
        }else{  
            $('#subject_error').fadeOut(300);  
        }  
        if(message.length == 0){  
            var error = true;  
            $('#message_error').fadeIn(300);  
        }else{  
            $('#message_error').fadeOut(300);  
        }  

        //now when the validation is done we check if the error variable is false (no errors)  
        if(error == false){  
            //disable the submit button to avoid spamming  
            //and change the button text to Sending...  
            $('#send_message').attr({'disabled' : 'true', 'value' : 'Sending...' });  

            /* using the jquery's post(ajax) function and a lifesaver 
            function serialize() which gets all the data from the form 
            we submit it to send_email.php */  
            $.post("send_email.php", $("#contact_form").serialize(),function(result){  
                //and after the ajax request ends we check the text returned  
                if(result == 'sent'){ 
                    //if the mail is sent remove the submit paragraph 
                     $('#send_message').remove(); 
                    //and show the mail success div with fadeIn 
                    $('#mail_success').fadeIn(300); 
                }else{ 
                    //show the mail failed div 
                    $('#mail_fail').fadeIn(300); 
                    //reenable the submit button by removing attribute disabled and change the text back to Send The Message 
                    $('#send_message').removeAttr('disabled').attr('value', 'Send The Message');  
                }  
            });  
        }  
    });  
});
4

3 に答える 3

1

一部のブラウザー XMLHttpRequest 実装 (特に IE) でサポートされていない可能性があるため、jQuery.post を使用してファイルを投稿することはできません。

ファイルを非同期的に (つまり AJAX) 送信する場合は、次のオプションがあります。

  • フォームのターゲットを iframe に設定し、それを iframe に「送信」して、親ドキュメントで JavaScript 関数を呼び出す JavaScript で応答します。実際には非同期ではありませんが、同じページに留まります。プログレスバーはありません。

  • HTML5 を使って (現時点では IE ではサポートされていませんが、chrome、firefox、safari で動作するはずです)、「HTML5 ファイルのアップロード」については google でこのような記事がたくさんあります。すべてのブラウザでサポートされているわけではありません。プログレス バーは可能です。

  • クロスブラウザー ソリューションが必要な場合は、pluploadをご覧ください。Plupload は、可能な限り HTML5 ファイルのアップロードを使用しようとします。それ以外の場合は、「隠し」フラッシュ アップローダーを使用します。

于 2013-02-09T12:06:40.287 に答える
1

以前、XHR 経由でファイルをアップロードするために必要な HTML5 サポートが IE には存在しないと述べていましたが、これは技術的には正しくありません。IE10 は、XHR/ajax 経由でファイルをアップロードする、ファイルをパーティションに分割して各パーティションを個別に送信する、失敗または中断されたアップロードを後で再開する、などに必要なすべてをサポートします。HTML5 File API をサポートしていないブラウザー (IE9 以前、Android 2.3.x 以前など) には別のソリューションが必要であることは事実です。車輪の再発明は頭痛の種でしかありませんが、既存のツールの 1 つを使用してください。すべての主要なブラウザーをシームレスに処理し、多くの機能を備え、非依存バージョンまたは jQuery バージョンのいずれかを含むFine Uploaderをお勧めします。

フォールバックとして Flash または Java を利用するプラグインがあります。これは必須ではありません。クライアント側の Java と Flash に関連する深刻なセキュリティ上の問題と、これらがもたらすサポートの悪夢のため、クライアント側で Flash と Java を避けることをお勧めします。Flash は死につつあり、Java (クライアント側) は死につつあります。将来的には、これら 2 つのオプションのいずれも含まれないため、ユーザー ベースのために、ネイティブ ブラウザ/JavaScript アプローチを使用してください。

于 2013-02-09T12:35:09.833 に答える
0

純粋な ajax アプローチで添付ファイルを送信することはできません。ファイルは送信されません。ただし、それらを非同期に処理できるプラグイン (ハック) が多数あります (例: AjaxFileUpload )。

于 2013-02-09T12:02:59.717 に答える