I’m working on a Drag and Drop function using Javascript as user side and PHP as backend. I would like to use Flask instead of PHP?
Javascript
function ui_add_log(message, color)
{
var d = new Date();
var dateString = (('0' + d.getHours())).slice(-2) + ':' +
(('0' + d.getMinutes())).slice(-2) + ':' +
(('0' + d.getSeconds())).slice(-2);
color = (typeof color === 'undefined' ? 'muted' : color);
var template = $('#debug-template').text();
template = template.replace('%%date%%', dateString);
template = template.replace('%%message%%', message);
template = template.replace('%%color%%', color);
$('#debug').find('li.empty').fadeOut(); // remove the 'no messages yet'
$('#debug').prepend(template);
}
// Creates a new file and add it to our list
function ui_multi_add_file(id, file)
{
var template = $('#files-template').text();
template = template.replace('%%filename%%', file.name);
template = $(template);
template.prop('id', 'uploaderFile' + id);
template.data('file-id', id);
$('#files').find('li.empty').fadeOut(); // remove the 'no files yet'
$('#files').prepend(template);
}
// Changes the status messages on our list
function ui_multi_update_file_status(id, status, message)
{
$('#uploaderFile' + id).find('span').html(message).prop('class', 'status text-' + status);
}
// Updates a file progress, depending on the parameters it may animate it or change the color.
function ui_multi_update_file_progress(id, percent, color, active)
{
color = (typeof color === 'undefined' ? false : color);
active = (typeof active === 'undefined' ? true : active);
var bar = $('#uploaderFile' + id).find('div.progress-bar');
bar.width(percent + '%').attr('aria-valuenow', percent);
bar.toggleClass('progress-bar-striped progress-bar-animated', active);
if (percent === 0){
bar.html('');
} else {
bar.html(percent + '%');
}
if (color !== false){
bar.removeClass('bg-success bg-info bg-warning bg-danger');
bar.addClass('bg-' + color);
}
}
$(function(){
/*
* UI functions ui_* can be located in: demo-ui.js
*/
$('#drag-and-drop-zone').dmUploader({ //
url: '../backend/upload.php',
maxFileSize: 3000000, // 3 Megs
onDragEnter: function(){
// Happens when dragging something over the DnD area
this.addClass('active');
},
onDragLeave: function(){
// Happens when dragging something OUT of the DnD area
this.removeClass('active');
},
onInit: function(){
// Plugin is ready to use
ui_add_log('Penguin initialized :)', 'info');
},
onComplete: function(){
// All files in the queue are processed (success or error)
ui_add_log('All pending tranfers finished');
},
onNewFile: function(id, file){
// When a new file is added using the file selector or the DnD area
ui_add_log('New file added #' + id);
ui_multi_add_file(id, file);
},
onBeforeUpload: function(id){
// about tho start uploading a file
ui_add_log('Starting the upload of #' + id);
ui_multi_update_file_status(id, 'uploading', 'Uploading...');
ui_multi_update_file_progress(id, 0, '', true);
},
onUploadCanceled: function(id) {
// Happens when a file is directly canceled by the user.
ui_multi_update_file_status(id, 'warning', 'Canceled by User');
ui_multi_update_file_progress(id, 0, 'warning', false);
},
onUploadProgress: function(id, percent){
// Updating file progress
ui_multi_update_file_progress(id, percent);
},
onUploadSuccess: function(id, data){
// A file was successfully uploaded
ui_add_log('Server Response for file #' + id + ': ' + JSON.stringify(data));
ui_add_log('Upload of file #' + id + ' COMPLETED', 'success');
ui_multi_update_file_status(id, 'success', 'Upload Complete');
ui_multi_update_file_progress(id, 100, 'success', false);
},
onUploadError: function(id, xhr, status, message){
ui_multi_update_file_status(id, 'danger', message);
ui_multi_update_file_progress(id, 0, 'danger', false);
},
onFallbackMode: function(){
// When the browser doesn't support this plugin :(
ui_add_log('Plugin cant be used here, running Fallback callback', 'danger');
},
onFileSizeError: function(file){
ui_add_log('File '' + file.name + '' cannot be added: size excess limit', 'danger');
}
});
});
PHP
<?php
header('Content-type:application/json;charset=utf-8');
try {
if (
!isset($_FILES['file']['error']) ||
is_array($_FILES['file']['error'])
) {
throw new RuntimeException('Invalid parameters.');
}
switch ($_FILES['file']['error']) {
case UPLOAD_ERR_OK:
break;
case UPLOAD_ERR_NO_FILE:
throw new RuntimeException('No file sent.');
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
throw new RuntimeException('Exceeded filesize limit.');
default:
throw new RuntimeException('Unknown errors.');
}
$filepath = sprintf('files/%s_%s', uniqid(), $_FILES['file']['name']);
if (!move_uploaded_file(
$_FILES['file']['tmp_name'],
$filepath
)) {
throw new RuntimeException('Failed to move uploaded file.');
}
// All good, send the response
echo json_encode([
'status' => 'ok',
'path' => $filepath
]);
} catch (RuntimeException $e) {
// Something went wrong, send the err message as JSON
http_response_code(400);
echo json_encode([
'status' => 'error',
'message' => $e->getMessage()
]);
}
HTML
<main role="main" class="container">
<div class="row">
<div class="col-md-6 col-sm-12">
<!-- Our markup, the important part here! -->
<div id="drag-and-drop-zone" class="dm-uploader p-5">
<h3 class="mb-5 mt-5 text-muted">Drag & drop files here</h3>
<div class="btn btn-primary btn-block mb-5">
<span>Open the file Browser</span>
<input type="file" title='Click to add Files' />
</div>
</div><!-- /uploader -->
</div>
<div class="col-md-6 col-sm-12">
<div class="card h-100">
<div class="card-header">
File List
</div>
<ul class="list-unstyled p-2 d-flex flex-column col"
id="files">
<li class="text-muted text-center empty">No files
uploaded.</li>
</ul>
</div>
</div>
</div><!-- /file list -->
<div class="row">
<div class="col-12">
<div class="card h-100">
<div class="card-header">
Debug Messages
</div>
<ul class="list-group list-group-flush" id="debug">
<li class="list-group-item text-muted empty">Loading
plugin....</li>
</ul>
</div>
</div>
</div> <!-- /debug -->
</main> <!-- /container -->
I’ve tried these links: