mirror of
https://gitlab.com/crafty-controller/crafty-4.git
synced 2024-08-30 18:23:09 +00:00
Add better feedback on upload max size failure
This commit is contained in:
parent
f00830aeb5
commit
dc69a8a9f2
@ -113,6 +113,12 @@ class UploadHandler(BaseHandler):
|
||||
self.do_upload = False
|
||||
|
||||
if self.do_upload:
|
||||
self.content_len = int(self.request.headers.get("Content-Length"))
|
||||
if self.content_len > MAX_STREAMED_SIZE:
|
||||
logger.error(
|
||||
f"User with ID {user_id} attempted to upload a file that"
|
||||
f" exceeded the max body size."
|
||||
)
|
||||
try:
|
||||
self.f = open(full_path, "wb")
|
||||
except Exception as e:
|
||||
|
@ -14,7 +14,8 @@
|
||||
<div class="col-12">
|
||||
<div class="page-header">
|
||||
<h4 class="page-title">
|
||||
{{ translate('serverDetails', 'serverDetails', data['lang']) }} - {{ data['server_stats']['server_id']['server_name'] }}
|
||||
{{ translate('serverDetails', 'serverDetails', data['lang']) }} - {{
|
||||
data['server_stats']['server_id']['server_name'] }}
|
||||
<br />
|
||||
<small>UUID: {{ data['server_stats']['server_id']['server_uuid'] }}</small>
|
||||
</h4>
|
||||
@ -44,15 +45,25 @@
|
||||
|
||||
<!-- Overlay content -->
|
||||
<div id="files-tree-nav-content" class="overlay-content">
|
||||
<a onclick="createFileE(event)" href="javascript:void(0)" id="createFile" href="#">{{ translate('serverFiles', 'createFile', data['lang']) }}</a>
|
||||
<a onclick="createDirE(event)" href="javascript:void(0)" id="createDir" href="#">{{ translate('serverFiles', 'createDir', data['lang']) }}</a>
|
||||
<a onclick="renameItemE(event)" href="javascript:void(0)" id="renameItem" href="#">{{ translate('serverFiles', 'rename', data['lang']) }}</a>
|
||||
<a onclick="uploadFilesE(event)" href="javascript:void(0)" id="upload" href="#">{{ translate('serverFiles', 'upload', data['lang']) }}</a>
|
||||
<a onclick="unzipFilesE(event)" href="javascript:void(0)" id="unzip" href="#">{{ translate('serverFiles', 'unzip', data['lang']) }}</a>
|
||||
<a onclick="downloadFileE(event)" href="javascript:void(0)" id="downloadFile" href="#">{{ translate('serverFiles', 'download', data['lang']) }}</a>
|
||||
<a onclick="deleteFileE(event)" href="javascript:void(0)" id="deleteFile" href="#" style="color: red">{{ translate('serverFiles', 'delete', data['lang']) }}</a>
|
||||
<a onclick="deleteDirE(event)" href="javascript:void(0)" id="deleteDir" href="#" style="color: red">{{ translate('serverFiles', 'delete', data['lang']) }}</a>
|
||||
<a href="javascript:void(0)" class="closebtn" style="color: #8862e0;" onclick="document.getElementById('files-tree-nav').style.display = 'none';">{{ translate('serverFiles', 'close', data['lang']) }}</a>
|
||||
<a onclick="createFileE(event)" href="javascript:void(0)" id="createFile" href="#">{{
|
||||
translate('serverFiles', 'createFile', data['lang']) }}</a>
|
||||
<a onclick="createDirE(event)" href="javascript:void(0)" id="createDir" href="#">{{
|
||||
translate('serverFiles', 'createDir', data['lang']) }}</a>
|
||||
<a onclick="renameItemE(event)" href="javascript:void(0)" id="renameItem" href="#">{{
|
||||
translate('serverFiles', 'rename', data['lang']) }}</a>
|
||||
<a onclick="uploadFilesE(event)" href="javascript:void(0)" id="upload" href="#">{{
|
||||
translate('serverFiles', 'upload', data['lang']) }}</a>
|
||||
<a onclick="unzipFilesE(event)" href="javascript:void(0)" id="unzip" href="#">{{
|
||||
translate('serverFiles', 'unzip', data['lang']) }}</a>
|
||||
<a onclick="downloadFileE(event)" href="javascript:void(0)" id="downloadFile" href="#">{{
|
||||
translate('serverFiles', 'download', data['lang']) }}</a>
|
||||
<a onclick="deleteFileE(event)" href="javascript:void(0)" id="deleteFile" href="#"
|
||||
style="color: red">{{ translate('serverFiles', 'delete', data['lang']) }}</a>
|
||||
<a onclick="deleteDirE(event)" href="javascript:void(0)" id="deleteDir" href="#" style="color: red">{{
|
||||
translate('serverFiles', 'delete', data['lang']) }}</a>
|
||||
<a href="javascript:void(0)" class="closebtn" style="color: #8862e0;"
|
||||
onclick="document.getElementById('files-tree-nav').style.display = 'none';">{{
|
||||
translate('serverFiles', 'close', data['lang']) }}</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@ -69,14 +80,17 @@
|
||||
overflow: scroll;
|
||||
|
||||
}
|
||||
|
||||
.overlay::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Hide scrollbar for IE, Edge and Firefox */
|
||||
.overlay {
|
||||
-ms-overflow-style: none; /* IE and Edge */
|
||||
scrollbar-width: none; /* Firefox */
|
||||
-ms-overflow-style: none;
|
||||
/* IE and Edge */
|
||||
scrollbar-width: none;
|
||||
/* Firefox */
|
||||
}
|
||||
|
||||
/* Position the content inside the overlay */
|
||||
@ -109,7 +123,8 @@
|
||||
}
|
||||
|
||||
/* When you mouse over the navigation links, change their color */
|
||||
.overlay a:hover, .overlay a:focus {
|
||||
.overlay a:hover,
|
||||
.overlay a:focus {
|
||||
background: #f1f3f7;
|
||||
color: #4b00ff;
|
||||
}
|
||||
@ -123,7 +138,10 @@
|
||||
|
||||
/* When the height of the screen is less than 450 pixels, change the font-size of the links and position the close button again, so they don't overlap */
|
||||
@media screen and (max-height: 450px) {
|
||||
.overlay a {font-size: 20px}
|
||||
.overlay a {
|
||||
font-size: 20px
|
||||
}
|
||||
|
||||
.overlay .closebtn {
|
||||
font-size: 40px;
|
||||
top: 15px;
|
||||
@ -134,14 +152,17 @@
|
||||
<ul class="tree-view">
|
||||
<li>
|
||||
<div id="root_dir" class="tree-ctx-item" data-path="{{ data['server_stats']['server_id']['path'] }}">
|
||||
<span id="{{ data['server_stats']['server_id']['path'] }}span" class="files-tree-title tree-caret-down root-dir" data-path="{{ data['server_stats']['server_id']['path'] }}" onclick="getToggleMain(event)">
|
||||
<span id="{{ data['server_stats']['server_id']['path'] }}span"
|
||||
class="files-tree-title tree-caret-down root-dir"
|
||||
data-path="{{ data['server_stats']['server_id']['path'] }}" onclick="getToggleMain(event)">
|
||||
<i class="far fa-folder"></i>
|
||||
<i class="far fa-folder-open"></i>
|
||||
{{ translate('serverFiles', 'files', data['lang']) }}
|
||||
</span>
|
||||
</div>
|
||||
<ul class="tree-nested d-block" id="files-tree">
|
||||
<li><i class="fa fa-spin fa-spinner"></i>{{ translate('serverFiles', 'loadingRecords', data['lang']) }}</li>
|
||||
<li><i class="fa fa-spin fa-spinner"></i>{{ translate('serverFiles', 'loadingRecords', data['lang'])
|
||||
}}</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
@ -161,12 +182,15 @@
|
||||
.tree-item,
|
||||
.files-tree-title {
|
||||
cursor: pointer;
|
||||
user-select: none; /* Prevent text selection */
|
||||
user-select: none;
|
||||
/* Prevent text selection */
|
||||
}
|
||||
|
||||
/* Create the caret/arrow with a unicode, and style it */
|
||||
.tree-caret .fa-folder {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.tree-caret .fa-folder-open {
|
||||
display: none;
|
||||
}
|
||||
@ -175,6 +199,7 @@
|
||||
.tree-caret-down .fa-folder {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.tree-caret-down .fa-folder-open {
|
||||
display: inline-block;
|
||||
}
|
||||
@ -193,13 +218,18 @@
|
||||
</div>
|
||||
{{ translate('serverFiles', 'keybindings', data['lang']) }}:
|
||||
<div class="btn-group" role="group">
|
||||
<button onclick="setKeyboard(event.target)" class="btn btn-primary" data-handler-name="null">{{ translate('serverFiles', 'default', data['lang']) }}</button>
|
||||
<button onclick="setKeyboard(event.target)" class="btn btn-secondary" data-handler-name="ace/keyboard/vim">Vim</button>
|
||||
<button onclick="setKeyboard(event.target)" class="btn btn-secondary" data-handler-name="ace/keyboard/emacs">Emacs</button>
|
||||
<button onclick="setKeyboard(event.target)" class="btn btn-secondary" data-handler-name="ace/keyboard/sublime">Sublime</button>
|
||||
<button onclick="setKeyboard(event.target)" class="btn btn-primary" data-handler-name="null">{{
|
||||
translate('serverFiles', 'default', data['lang']) }}</button>
|
||||
<button onclick="setKeyboard(event.target)" class="btn btn-secondary"
|
||||
data-handler-name="ace/keyboard/vim">Vim</button>
|
||||
<button onclick="setKeyboard(event.target)" class="btn btn-secondary"
|
||||
data-handler-name="ace/keyboard/emacs">Emacs</button>
|
||||
<button onclick="setKeyboard(event.target)" class="btn btn-secondary"
|
||||
data-handler-name="ace/keyboard/sublime">Sublime</button>
|
||||
</div>
|
||||
<h3 id="file_warn"></h3>
|
||||
<button class="btn btn-success" onclick="save()"><i class="fas fa-save"></i> {{ translate('serverFiles', 'save', data['lang']) }}</button>
|
||||
<button class="btn btn-success" onclick="save()"><i class="fas fa-save"></i> {{ translate('serverFiles',
|
||||
'save', data['lang']) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -514,6 +544,7 @@
|
||||
},
|
||||
success: function (data) {
|
||||
console.log("got response:");
|
||||
//TODO add better feedback for file saves
|
||||
console.log(data);
|
||||
},
|
||||
});
|
||||
@ -622,15 +653,17 @@
|
||||
}
|
||||
|
||||
function sendFile(file, path, serverId, left, onProgress) {
|
||||
var xmlHttpRequest = new XMLHttpRequest();
|
||||
var token = getCookie("_xsrf")
|
||||
var fileName = file.name
|
||||
var target = '/upload?server_id=' + serverId
|
||||
var mimeType = file.type
|
||||
let xmlHttpRequest = new XMLHttpRequest();
|
||||
let token = getCookie("_xsrf")
|
||||
let fileName = file.name
|
||||
let target = '/upload?server_id=' + serverId
|
||||
let mimeType = file.type
|
||||
let size = file.size
|
||||
|
||||
xmlHttpRequest.open('POST', target, true);
|
||||
xmlHttpRequest.setRequestHeader('X-Content-Type', mimeType);
|
||||
xmlHttpRequest.setRequestHeader('X-XSRFToken', token);
|
||||
xmlHttpRequest.setRequestHeader('X-Content-Length', size);
|
||||
xmlHttpRequest.setRequestHeader('X-Content-Disposition', 'attachment; filename="' + fileName + '"');
|
||||
xmlHttpRequest.setRequestHeader('X-Path', path);
|
||||
xmlHttpRequest.setRequestHeader('X-Files-Left', left);
|
||||
@ -649,13 +682,26 @@
|
||||
}, false);
|
||||
xmlHttpRequest.addEventListener('error', (e) => {
|
||||
console.error('Error while uploading file', file.name + '.', 'Event:', e)
|
||||
var dialog = bootbox.dialog({
|
||||
title: 'Error on Upload',
|
||||
message: "Fix size exceeded the max body size. Contact your system administrator.",
|
||||
size: 'large',
|
||||
buttons: {
|
||||
ok: {
|
||||
label: "Ok",
|
||||
className: 'btn-info',
|
||||
callback: function () {
|
||||
document.location.reload();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}, false);
|
||||
|
||||
xmlHttpRequest.send(file);
|
||||
}
|
||||
|
||||
var uploadWaitDialog;
|
||||
var doUpload = true;
|
||||
let uploadWaitDialog;
|
||||
let doUpload = true;
|
||||
|
||||
function uploadFilesE(event) {
|
||||
path = event.target.parentElement.getAttribute('data-path');
|
||||
|
Loading…
Reference in New Issue
Block a user