上传时的 Dropzone 提交按钮
Dropzone Submit Button on Upload
我想添加一个按钮上传到我的 dropzone 文件上传器。目前它是在选择文件或将文件拖到拖放区后直接上传文件。我想做的是:
1. Select 或drap文件待上传。
2. 验证
3. 点击或按下上传按钮上传文件。
N.B: 文件只有在按下上传按钮后才会上传。
这是我的表格
<form id='frmTarget' name='dropzone' action='upload_files.php' class='dropzone'>
<div class='fallback'>
<input name='file' type='file' multiple />
</div>
<input id='refCampaignID' name='refCampaignID' type='hidden' value=\ "$rowCampaign->CampaignID\" />
</form>
这是我的 JS
Dropzone.options.frmTarget =
{
url: 'upload_files.php',
paramName: 'file',
clickable: true,
maxFilesize: 5,
uploadMultiple: true,
maxFiles: 2,
addRemoveLinks: true,
acceptedFiles: '.png,.jpg,.pdf',
dictDefaultMessage: 'Upload your files here',
success: function(file, response)
{
setTimeout(function() {
$('#insert_pic_div').hide();
$('#startEditingDiv').show();
}, 2000);
}
};
这是我的phppost请求
foreach ($_FILES["file"] as $key => $arrDetail)
{
foreach ($arrDetail as $index => $detail) {
//print_rr($_FILES["file"][$key][$index]);
$targetDir = "project_images/";
$fileName = $_FILES["file"]['name'][$index];
$targetFile = $targetDir.$fileName;
if(move_uploaded_file($_FILES["file"]['tmp_name'][$index],$targetFile))
{
$db = new ZoriDatabase("tblTarget", $_REQUEST["TargetID"], null, 0);
$db->Fields["refCampaignID"] = $_REQUEST["refCampaignID"];
$db->Fields["strPicture"] = $fileName;
$db->Fields["blnActive"] = 1;
$db->Fields["strLastUser"] = $_SESSION[USER]->USERNAME;
$result = $db->Save();
if($result->Error == 1){
return "Details not saved.";
}else{
return "Details saved.";
}
}else{
return "File not uploaded.";
}
}
}
您需要:
添加按钮:
<button type="submit" id="button" class="btn btn-primary">Submit</button>
告诉 Dropzone 不要 在您放下文件时自动上传文件,默认情况下会自动上传。这是用 the autoProcessQueue
config option:
完成的
autoProcessQueue: false
由于 Dropzone 现在不会自动上传文件,您需要在单击按钮时手动告诉它这样做。所以你需要一个按钮点击的事件处理程序,它告诉 Dropzone 进行上传:
$("#button").click(function (e) {
e.preventDefault();
myDropzone.processQueue();
});
这将只是 POST 上传的文件,没有任何其他输入字段。您可能想要 post 所有字段,例如您的 refCampaignID
、CSRF 令牌(如果有的话)等。为此,您需要在发送前将它们复制到 POST 中。 Dropzone 有一个 sending
event ,它在每个文件发送之前被调用,您可以在其中添加回调:
this.on('sending', function(file, xhr, formData) {
// Append all form inputs to the formData Dropzone will POST
var data = $('form').serializeArray();
$.each(data, function(key, el) {
formData.append(el.name, el.value);
});
});
综合起来:
Dropzone.options.frmTarget = {
autoProcessQueue: false,
url: 'upload_files.php',
init: function () {
var myDropzone = this;
// Update selector to match your button
$("#button").click(function (e) {
e.preventDefault();
myDropzone.processQueue();
});
this.on('sending', function(file, xhr, formData) {
// Append all form inputs to the formData Dropzone will POST
var data = $('#frmTarget').serializeArray();
$.each(data, function(key, el) {
formData.append(el.name, el.value);
});
});
}
}
我想我也会添加一个纯 vanilla JS 解决方案,没有 jQuery。
/* 'dropform' is a camelized version of your dropzone form's ID */
Dropzone.options.dropform = {
/* Add all your configuration here */
autoProcessQueue: false,
init: function()
{
let myDropzone = this;
/* 'submit-dropzone-btn' is the ID of the form submit button */
document.getElementById('submit-dropzone-btn').addEventListener("click", function (e) {
e.preventDefault();
myDropzone.processQueue();
});
this.on('sending', function(file, xhr, formData)
{
/* OPTION 1 (not recommended): Construct key/value pairs from inputs in the form to be sent off via new FormData
'dropform' is the ID of your dropzone form
This method still works, but it's submitting a new form instance. */
formData = new FormData(document.getElementById('dropform'));
/* OPTION 2: Append inputs to FormData */
formData.append("input-name", document.getElementById('input-id').value);
});
}
};
注意: 设置事件监听器,例如我们在这里做的 sending
应该放在 init
函数中。如果您要将它们放在其他地方,例如:
init: function()
{
//...
},
sending: function(file, xhr, formData)
{
//... logic before each file send
}
这将覆盖 dropzone 为 sending
事件侦听器提供的默认逻辑,并可能导致意外的副作用。只有当你知道自己在做什么时才应该这样做。
我想添加一个按钮上传到我的 dropzone 文件上传器。目前它是在选择文件或将文件拖到拖放区后直接上传文件。我想做的是: 1. Select 或drap文件待上传。 2. 验证 3. 点击或按下上传按钮上传文件。
N.B: 文件只有在按下上传按钮后才会上传。
这是我的表格
<form id='frmTarget' name='dropzone' action='upload_files.php' class='dropzone'>
<div class='fallback'>
<input name='file' type='file' multiple />
</div>
<input id='refCampaignID' name='refCampaignID' type='hidden' value=\ "$rowCampaign->CampaignID\" />
</form>
这是我的 JS
Dropzone.options.frmTarget =
{
url: 'upload_files.php',
paramName: 'file',
clickable: true,
maxFilesize: 5,
uploadMultiple: true,
maxFiles: 2,
addRemoveLinks: true,
acceptedFiles: '.png,.jpg,.pdf',
dictDefaultMessage: 'Upload your files here',
success: function(file, response)
{
setTimeout(function() {
$('#insert_pic_div').hide();
$('#startEditingDiv').show();
}, 2000);
}
};
这是我的phppost请求
foreach ($_FILES["file"] as $key => $arrDetail)
{
foreach ($arrDetail as $index => $detail) {
//print_rr($_FILES["file"][$key][$index]);
$targetDir = "project_images/";
$fileName = $_FILES["file"]['name'][$index];
$targetFile = $targetDir.$fileName;
if(move_uploaded_file($_FILES["file"]['tmp_name'][$index],$targetFile))
{
$db = new ZoriDatabase("tblTarget", $_REQUEST["TargetID"], null, 0);
$db->Fields["refCampaignID"] = $_REQUEST["refCampaignID"];
$db->Fields["strPicture"] = $fileName;
$db->Fields["blnActive"] = 1;
$db->Fields["strLastUser"] = $_SESSION[USER]->USERNAME;
$result = $db->Save();
if($result->Error == 1){
return "Details not saved.";
}else{
return "Details saved.";
}
}else{
return "File not uploaded.";
}
}
}
您需要:
添加按钮:
<button type="submit" id="button" class="btn btn-primary">Submit</button>
告诉 Dropzone 不要 在您放下文件时自动上传文件,默认情况下会自动上传。这是用 the
完成的autoProcessQueue
config option:autoProcessQueue: false
由于 Dropzone 现在不会自动上传文件,您需要在单击按钮时手动告诉它这样做。所以你需要一个按钮点击的事件处理程序,它告诉 Dropzone 进行上传:
$("#button").click(function (e) { e.preventDefault(); myDropzone.processQueue(); });
这将只是 POST 上传的文件,没有任何其他输入字段。您可能想要 post 所有字段,例如您的
refCampaignID
、CSRF 令牌(如果有的话)等。为此,您需要在发送前将它们复制到 POST 中。 Dropzone 有一个sending
event ,它在每个文件发送之前被调用,您可以在其中添加回调:this.on('sending', function(file, xhr, formData) { // Append all form inputs to the formData Dropzone will POST var data = $('form').serializeArray(); $.each(data, function(key, el) { formData.append(el.name, el.value); }); });
综合起来:
Dropzone.options.frmTarget = {
autoProcessQueue: false,
url: 'upload_files.php',
init: function () {
var myDropzone = this;
// Update selector to match your button
$("#button").click(function (e) {
e.preventDefault();
myDropzone.processQueue();
});
this.on('sending', function(file, xhr, formData) {
// Append all form inputs to the formData Dropzone will POST
var data = $('#frmTarget').serializeArray();
$.each(data, function(key, el) {
formData.append(el.name, el.value);
});
});
}
}
我想我也会添加一个纯 vanilla JS 解决方案,没有 jQuery。
/* 'dropform' is a camelized version of your dropzone form's ID */
Dropzone.options.dropform = {
/* Add all your configuration here */
autoProcessQueue: false,
init: function()
{
let myDropzone = this;
/* 'submit-dropzone-btn' is the ID of the form submit button */
document.getElementById('submit-dropzone-btn').addEventListener("click", function (e) {
e.preventDefault();
myDropzone.processQueue();
});
this.on('sending', function(file, xhr, formData)
{
/* OPTION 1 (not recommended): Construct key/value pairs from inputs in the form to be sent off via new FormData
'dropform' is the ID of your dropzone form
This method still works, but it's submitting a new form instance. */
formData = new FormData(document.getElementById('dropform'));
/* OPTION 2: Append inputs to FormData */
formData.append("input-name", document.getElementById('input-id').value);
});
}
};
注意: 设置事件监听器,例如我们在这里做的 sending
应该放在 init
函数中。如果您要将它们放在其他地方,例如:
init: function()
{
//...
},
sending: function(file, xhr, formData)
{
//... logic before each file send
}
这将覆盖 dropzone 为 sending
事件侦听器提供的默认逻辑,并可能导致意外的副作用。只有当你知道自己在做什么时才应该这样做。