Bootstrap File InputプラグインのKrajeeを使用して、AJAX呼び出しを介してアップロードを実行しています。
KrajeeプラグインAJAXセクションへのリンクは次のとおりです。 Krajee plugin AJAX
私が使用しているJSおよびPHP(codeigniter)コードは次のとおりです。
JS:
<script>
$("#file-upload").fileinput({
'allowedFileExtensions' : ['csv'],
'maxFileSize': 5120,
'maxFileCount': 1,
'uploadUrl': 'dashboard/uploader',
'elErrorContainer': '#errorBlock',
'uploadAsync': true,
'msgInvalidFileExtension': 'Invalid extension for file "{name}". Only "{extensions}" files are supported.',
'uploadExtraData': {csrf_token_name: $("input[name=csrf_token_name]").val()}
});
</script>
PHP:
public function uploader(){
$config['upload_path'] = './csv_uploads/';
$config['allowed_types'] = 'csv';
$config['max_size'] = '5120';
$this->upload->initialize($config);
if (!$this->upload->do_upload("file-upload")){
$data['error'] = 'The following error occured : '.$this->upload->display_errors().'Click on "Remove" and try again!';
echo json_encode($data);
} else {
echo json_encode("success");
}
}
現在、JSONとしてのエラーまたは成功にかかわらず、PHPから応答を受け取ります。プラグインのドキュメントを調べましたが、AJAX応答をキャッチしてそれに応じて行動する方法を見つけることができません。 ajax success関数を使用してjQueryで行うように、その応答に対して:
success: function (response) {
//Deal with the server side "response" data.
},
これどうやってするの?
ここでデモをチェックできます live demo
成功イベントを起動する場合は、忘れずにuploadAsync falseを設定してください
サンプルコード:
JS
$("#input-id").fileinput({
showRemove:false,
showPreview: false,
uploadUrl: "../xxxx/xxxx/XXXXXX.php", // server upload action
uploadAsync: false,
uploadExtraData: function() {
return {
bdInteli: xxxx
};
}
});
// CATCH RESPONSE
$('#input-id').on('filebatchuploaderror', function(event, data, previewId, index) {
var form = data.form, files = data.files, extra = data.extra,
response = data.response, reader = data.reader;
});
$('#input-id').on('filebatchuploadsuccess', function(event, data, previewId, index) {
var form = data.form, files = data.files, extra = data.extra,
response = data.response, reader = data.reader;
alert (extra.bdInteli + " " + response.uploaded);
});
PHP
$nombre = $_FILES["ficheroExcel"]["name"];
$bdInteli = $_POST['bdInteli'];
if (move_uploaded_file($_FILES["ficheroExcel"]["tmp_name"], $nombre) ){
$output = array('uploaded' => 'OK' );
} else {
$output = array('uploaded' => 'ERROR' );
}
echo json_encode($output);
プラグインのドキュメントページのイベントセクション を読んで、プラグインによって提供されるさまざまなイベントを理解できます。
プラグインでのajaxアップロードの設定方法によって異なります。プラグインには、ドキュメントに記載されている2つの ajaxアップロードモード-同期および非同期 が用意されています。 uploadAsync
プロパティがtrue
に設定されている場合は非同期です。
FOR AJAX SUCCESS TRAP:
FOR AJAXエラートラップ:
あなたの場合、uploadAsync
をtrueに設定しているので、非同期設定/イベントを使用します。
私のテストでは、このサンプルコードをテストで使用できます。私の応答データは次のようになります。
response data:
{
"ver":"1.0",
"ret":true,
"errmsg":null,
"errcode":0,
"data":{
"status":"upload success",
"originalFilename":"testFileName.txt",
"fileName":"excelFile",
"fileType":"text/plain",
"fileSize":1733
}
javascript code:
$('#input-id').on('fileuploaded', function(event, data, previewId, index) {
var response = data.response;
if(response.ret ) {
alert("upload success!"+data.response.data);
}else{
alert("upload failed!"+response.errmsg)
}
alert('File uploaded triggered'+form+"response:"+response);
console.info(response.data);
});
この回答を参照 、私はこのようにした
javascript:
$('#input-id').on('fileuploaded', function(event, data, previewId, index) {
var form = data.form, files = data.files, extra = data.extra,
response = data.response, reader = data.reader;
console.log('File uploaded successfully : ID '+ data.response.d);
});
In[〜#〜] ashx [〜#〜]コンテキストへのファイル追加応答:
context.Response.ContentType = "application/json";
string myId = "NewwId 1";
var wrapper = new { d = myId };
context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(wrapper));