2017-07-12 9 views
1

サーバー側のtype = "file"入力へのアクセス方法を理解するのが少し難しいです。以下は私が使用しているコードです。私はAJAXを使用しています。なぜなら私のWebアプリケーションをリフレッシュする必要がないようにするために、私はフォームを提出するために多少ラウンドアバウトの方法を使用しています。サーバー側のPOSTメソッドからのtype = "file"へのアクセス

マイHTML:

<form id="updateProfileImageForm" enctype="multipart/form-data"> 
      <div class="updateProfileImageContainer"> 
       <img src="images/profile/generic.png" class="updateProfileImage"> 
       <div class="updateProfileImageOverlay" onclick="changeImageToUpload()"> 
       <div class="updateProfileImageOverlayText">Upload new image</div> 
       </div> 
       <input type="file" id="imageToUpload" name="image" style="display: none;" onChange="$(this).closest('form').trigger('submit');"></input> 
      </div> 
      </form> 

マイJS:

function changeImageToUpload() { 
    $('#imageToUpload').trigger('click'); 
}  

$('#updateProfileImageForm').submit(function(e) { 
     e.preventDefault(); 
     var form_data = new FormData(this); 

     $.ajax({ 
     type: 'POST', 
     url: '/changeProfile', 
     data: form_data, 
     processData: false, 
     success: function(response) { 
      if(response.message != null) { 
      alert(response.message); 
      } else { 
      // Change profile image displayed 
      $('.updateProfileImage').attr("src", response.newProfileImage); 
      alert('Profile picture successfully updated! Refresh your browser to update your window!'); 
      } 
     } 
     }) 
    }); 

私のサーバーのPHP:$ _FILESの

if (isset($_FILES['image'])) { 
     $image = $_FILES['image']; 
    } 

のvar_dumpは$ _POSTショーでのvar_dumpながら、空の配列を示しています多くの情報(私は自分のデータファイルと推測しています)。しかし、$ _POSTまたは$ _FILESのいずれか($ _POST ['image']または$ _FILES ['image']のいずれか)の 'image'プロパティにアクセスすると、私に "未定義のインデックス"または "未定義の変数"が与えられます。

君たちに私を教育するほど親切のようになります。

  1. $ _POSTと$ _FILESの違いは何ですか?

  2. この場合、どのようにファイルにアクセスする必要がありますか?

ありがとう!

+1

'$ _POST'と' $ _FILES'は、異なる情報を格納する超大域変数です。 '$ _FILES'だけを使ってファイル情報にアクセスすることができます。投稿情報とファイル情報の両方を返す '$ _REQUEST'もあります。 OK。したがって、 '$ _POST'は型ファイルの入力を除くフォームからすべてのデータを返し、' $ _FOSES'はそれと逆の動作をします。 – Ionut

+0

以下は問題の原因ではなく、可能性を排除します。コントロールからstyle = 'display:none'を削除し、それが機能するかどうか確認してください。そうであれば、style = 'position:absolute;左:-999px; ' – jeff

答えて

0

あなたのAjaxのリクエストで必要な設定オプションが欠落している、あなたは偽

$.ajax({ 
    type: 'POST', 
    url: '/changeProfile', 
    data: form_data, 
    processData: false, 
    contentType: false, 
    success: function(response) { 
     if(response.message != null) { 
     alert(response.message); 
     } else { 
     // Change profile image displayed 
     $('.updateProfileImage').attr("src", response.newProfileImage); 
     alert('Profile picture successfully updated! Refresh your browser to update your window!'); 
     } 
    } 
    }) 

jQuery.ajaxは、アプリケーション/ x軸に、デフォルトでは、コンテンツタイプを設定するのcontentTypeを設定する必要がありますwww-form-urlencodedがFormDataオブジェクトに対して正しくない場合、falseに設定すると、それは基礎となるXMLHTTPRequestオブジェクトによって正しく設定されます。

-1

背後にあるアイデア。 ファイルをPHPのポストとして使用するのではなく、イメージをbase64に変換し、phpのajaxを使用してその文字列を受け取るだけです。

Refer to this URL

+1

これは、ファイルのアップロードを扱う醜い方法です。ファイルの種類が画像でない場合はどうしますか? – Ionut

+0

これはあなた次第です。しかし、多くの場合、それは私を多く助けます。 :) –

+0

このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 –

関連する問題