フォームなしのファイルのアップロード


93

フォームをまったく使用せずに、<input type="file">jQueryを使用するPOSTメソッドを使用して、ファイルを 'upload.php'に送信できますか?入力タグがフォームタグ内にありません。個別に立っています。したがって、「ajaxForm」や「ajaxSubmit」などのjQueryプラグインを使用したくありません。


1
これを試してください:uploadify.comですが、フラッシュバージョンを使用してください。さあ、あなたの岩を投げます。HTML5バージョンがフォームなしで機能するかどうかはわかりません。たぶんそうでしょうが、私にはわかりません。
Ismael Miguel

1
Arrr ....私はHTML 5で動作するはずだと言いたいのですが、プラットフォームの互換性の問題と数年以上前のブラウザがはびこるでしょう。フォームを作成する場合、または地獄からフォームを動的に生成する場合の害は何ですか?
Yitzhak 2015

回答:


93

FormDataを使用して、POSTリクエストでデータを送信できます。以下に簡単な例を示します。

var myFormData = new FormData();
myFormData.append('pictureFile', pictureInput.files[0]);

$.ajax({
  url: 'upload.php',
  type: 'POST',
  processData: false, // important
  contentType: false, // important
  dataType : 'json',
  data: myFormData
});

リクエストの設定(URL、メソッド、パラメーターデータなど)がわかっていれば、フォームを使用してajaxリクエストを行う必要はありません。


私見これは最良の解決策ですが、別の選択肢は、内部で<iframeを使用して、通常のポストバックを行うことができます
John Smith

はい、そうです。古いブラウザは、ファイルをアップロードするためのFormDataとajaxをサポートしていません。これらのブラウザでフォールバックとしてiframeを使用する場合の解決策は次のとおりです。
Omid Monshizadeh 2014年

7
設定オブジェクトに追加することprocessData: falseを忘れないでください。そうしないcontentType: falseと、Uncaught TypeError:Illegal invocation
jsmiff

2
おい、あなたは私の命を救った!:D @monshiと@ jsmiffに感謝します(SOFは同じコメントに複数のユーザーを許可しません)。
Silvio Delgado

4
これでpictureInputは何ですか?
developeraumya

30

ここでのすべての回答は引き続きFormData APIを使用しています"multipart/form-data"フォームのないアップロードのようなものです。次のようにPOST使用して、リクエストの本文内のコンテンツとしてファイルを直接アップロードすることもできますxmlHttpRequest

var xmlHttpRequest = new XMLHttpRequest();

var file = ...file handle...
var fileName = ...file name...
var target = ...target...
var mimeType = ...mime type...

xmlHttpRequest.open('POST', target, true);
xmlHttpRequest.setRequestHeader('Content-Type', mimeType);
xmlHttpRequest.setRequestHeader('Content-Disposition', 'attachment; filename="' + fileName + '"');
xmlHttpRequest.send(file);

Content-TypeそしてContent-Dispositionヘッダは、我々は(MIMEタイプおよびファイル名)を送信しているものを説明するために使用されています。

ここにも同様の答えを投稿しました


1
これは素晴らしい答えです。フォームデータの使用を完全に回避しています。xmlHttpRequestの使用法にもう少し追加できます。XMLHttpRequestを使用すると、クライアント(UIページ)をブロックしない非同期操作を実行できます。HTMLフォームを使用している間、操作の実行中はクライアント(UIページ)がブロックされます。
ハリー

どうfetch()ですか?
Vitaly Zdanevich

@VitalyZdanevichどういう意味かわかりませんか?
ウィルト

この方法はIEで機能しますか?
トニーコブ

13

このチュートリアルに基づいて、これを行う非常に基本的な方法を次に示します。

$('your_trigger_element_selector').on('click', function(){    
    var data = new FormData();
    data.append('input_file_name', $('your_file_input_selector').prop('files')[0]);
    // append other variables to data if you want: data.append('field_name_x', field_value_x);

    $.ajax({
        type: 'POST',               
        processData: false, // important
        contentType: false, // important
        data: data,
        url: your_ajax_path,
        dataType : 'json',  
        // in PHP you can call and process file in the same way as if it was submitted from a form:
        // $_FILES['input_file_name']
        success: function(jsonData){
            ...
        }
        ...
    }); 
});

適切なエラー処理を追加することを忘れないでください


11

ステップ1:HTMLコードを配置するHTMLページを作成します。

ステップ2:HTMLコードページの下(フッター)JavaScriptを作成し、スクリプトタグにJqueryコードを挿入します。

ステップ3:過去のPHPファイルとphpコードのコピーを作成します。$.ajaxコードURLのJqueryコードの後に、phpファイル名に適用されます。

JS

//$(document).on("change", "#avatar", function() {   // If you want to upload without a submit button 
$(document).on("click", "#upload", function() {
  var file_data = $("#avatar").prop("files")[0]; // Getting the properties of file from file field
  var form_data = new FormData(); // Creating object of FormData class
  form_data.append("file", file_data) // Appending parameter named file with properties of file_field to form_data
  form_data.append("user_id", 123) // Adding extra parameters to form_data
  $.ajax({
    url: "/upload_avatar", // Upload Script
    dataType: 'script',
    cache: false,
    contentType: false,
    processData: false,
    data: form_data, // Setting the data attribute of ajax with file_data
    type: 'post',
    success: function(data) {
      // Do something after Ajax completes 
    }
  });
});

HTML

<input id="avatar" type="file" name="avatar" />
<button id="upload" value="Upload" />

PHP

print_r($_FILES);
print_r($_POST);

1
コードにコメント/説明を追加してください
kvorobiev

行方不明,の後にtype: 'post'
ラスト

1
私の一日を作りました:)ありがとう
shekhardtu

tmpフォーム全体が送信されるまで、ファイルをディレクトリにアップロードできますか?(それはマルチフォームだったと言います)?
thesayhey

これらのフォーム変数をJavaコードでどのように参照しますか
Bhaskara Arani '11

1

このパグリンsimpleUploadを試してください、フォームは必要ありません

HTML:

<input type="file" name="arquivo" id="simpleUpload" multiple >
<button type="button" id="enviar">Enviar</button>

JavaScript:

$('#simpleUpload').simpleUpload({
  url: 'upload.php',
  trigger: '#enviar',
  success: function(data){
    alert('Envio com sucesso');

  }
});

1

申し訳ありませんがあるためにその男が、AngularJSは、シンプルかつエレガントなソリューションを提供しています。

これが私が使用するコードです:

ngApp.controller('ngController', ['$upload',
function($upload) {

  $scope.Upload = function($files, index) {
    for (var i = 0; i < $files.length; i++) {
      var file = $files[i];
      $scope.upload = $upload.upload({
        file: file,
        url: '/File/Upload',
        data: {
          id: 1 //some data you want to send along with the file,
          name: 'ABC' //some data you want to send along with the file,
        },

      }).progress(function(evt) {

      }).success(function(data, status, headers, config) {
          alert('Upload done');
        }
      })
    .error(function(message) {
      alert('Upload failed');
    });
  }
};
}]);
.Hidden {
  display: none
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div data-ng-controller="ngController">
  <input type="button" value="Browse" onclick="$(this).next().click();" />
  <input type="file" ng-file-select="Upload($files, 1)" class="Hidden" />
</div>

サーバー側には、Request.Filesコレクションで見つかったアップロードされたファイルを保存し、JsonResultを返すアクションを持つMVCコントローラーがあります。

AngularJSを使用している場合は、試してみてください。使用していない場合は、ごめんなさい:-)


$ uploadディレクティブで動作しないため反対投票
NicoJuicy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.