Fix file upload

This commit is contained in:
Dennis Eichhorn 2018-11-03 15:17:24 +01:00
parent d93224fc31
commit 822cd3ebbe
5 changed files with 30 additions and 24 deletions

View File

@ -29,25 +29,32 @@
const self = this; const self = this;
if (!form.querySelector('input[type=file]')|| !document.querySelector('input[type=file][form=' + form.id + ']')) { if (!form.querySelector('input[type=file]') || !document.querySelector('input[type=file][form=' + form.id + ']')) {
try { try {
// Inject media upload into form view // Inject media upload into form view
this.app.uiManager.getFormManager().get(form.id).injectSubmit(function (e, requestId, requestGroup) this.app.uiManager.getFormManager().get(form.id).injectSubmit(function (e, requestId)
{ {
/** global: jsOMS */ /** global: jsOMS */
let fileFields = e.querySelectorAll('input[type=file]'), let fileFields = document.querySelectorAll(
'#' + e.id + ' input[type=file], '
+ 'input[form=' + e.id + '][type=file]'
),
uploader = new jsOMS.Modules.Models.Media.Upload(self.app.responseManager); uploader = new jsOMS.Modules.Models.Media.Upload(self.app.responseManager);
uploader.setSuccess(e.id, function (type, response) uploader.setSuccess(e.id, function (type, response)
{ {
e.querySelector('input[type=file]+input[type=hidden]').value = JSON.stringify(response.uploads); document.querySelector('input[form=' + e.id + '][type=file]+input[form=' + e.id + '][type=hidden]').value = JSON.stringify(response);
self.app.eventManager.trigger(requestGroup, requestId); self.app.eventManager.trigger(form.id, requestId);
}); });
uploader.setUri('{/base}/{/lang}/api/media'); uploader.setUri('{/base}/{/lang}/api/media');
for (let i = 0; i < fileFields.length; i++) { const length = fileFields.length;
for (let j = 0; j < fileFields[i].files.length; j++) { let fileLength = 0;
for (let i = 0; i < length; i++) {
fileLength = fileFields[i].files.length;
for (let j = 0; j < fileLength; j++) {
uploader.addFile(fileFields[i].files[j]); uploader.addFile(fileFields[i].files[j]);
} }
} }

View File

@ -61,7 +61,7 @@ class ApiController extends Controller
$uploads = $this->uploadFiles( $uploads = $this->uploadFiles(
$request->getFiles(), $request->getFiles(),
$request->getHeader()->getAccount(), $request->getHeader()->getAccount(),
(string) ($request->getData('path') ?? __DIR__ . '/../../Modules/Media/Files') (string) ($request->getData('path') ?? __DIR__ . '/../../../Modules/Media/Files')
); );
$ids = []; $ids = [];
@ -70,7 +70,7 @@ class ApiController extends Controller
} }
$response->getHeader()->set('Content-Type', MimeType::M_JSON . '; charset=utf-8', true); $response->getHeader()->set('Content-Type', MimeType::M_JSON . '; charset=utf-8', true);
$response->set($request->getUri()->__toString(), [['uploads' => $ids, 'type' => 'UI']]); $response->set($request->getUri()->__toString(), $ids);
} }
/** /**
@ -117,7 +117,7 @@ class ApiController extends Controller
public static function createMediaPath(string $basePath = 'Modules/Media/Files') : string public static function createMediaPath(string $basePath = 'Modules/Media/Files') : string
{ {
$rndPath = str_pad(dechex(rand(0, 65535)), 4, '0', STR_PAD_LEFT); $rndPath = \str_pad(\dechex(\mt_rand(0, 65535)), 4, '0', STR_PAD_LEFT);
return $basePath . '/' . $rndPath[0] . $rndPath[1] . '/' . $rndPath[2] . $rndPath[3]; return $basePath . '/' . $rndPath[0] . $rndPath[1] . '/' . $rndPath[2] . $rndPath[3];
} }

View File

@ -66,9 +66,9 @@
{ {
// TODO: validate file type + file size // TODO: validate file type + file size
let request = new jsOMS.Message.Request.Request(), const request = new jsOMS.Message.Request.Request(),
formData = new FormData(), formData = new FormData(),
self = this; self = this;
this.files.forEach(function (element, index) this.files.forEach(function (element, index)
{ {
@ -76,23 +76,22 @@
}); });
request.setData(formData); request.setData(formData);
request.setType(jsOMS.Message.Request.RequestType.RAW); request.setType(jsOMS.Message.Request.RequestType.FILE);
request.setUri(this.uri); request.setUri(this.uri);
request.setMethod(jsOMS.Message.Request.RequestMethod.POST); request.setMethod(jsOMS.Message.Request.RequestMethod.POST);
request.setRequestHeader('HTTP_X_REQUESTED_WITH', 'XMLHttpRequest'); request.setRequestHeader('HTTP_X_REQUESTED_WITH', 'XMLHttpRequest');
request.setSuccess(function (xhr) request.setSuccess(function (xhr)
{ {
try { try {
let response = JSON.parse(xhr.response); const response = JSON.parse(xhr.response);
for (let k = 0; k < response.length; ++k) { if (!self.success[formId]) {
if (!self.success[formId]) { self.responseManager.run(null, response);
self.responseManager.run(response[k].type, response[k]); } else {
} else { self.success[formId](null, response);
self.success[formId](response[k].type, response[k]);
}
} }
} catch (e) { } catch (e) {
console.log(e);
jsOMS.Log.Logger.instance.error(e); jsOMS.Log.Logger.instance.error(e);
jsOMS.Log.Logger.instance.error('Invalid media upload response: ' + xhr.response); jsOMS.Log.Logger.instance.error('Invalid media upload response: ' + xhr.response);
} }

View File

@ -156,7 +156,7 @@ class UploadFile
} }
if (!\is_dir($path)) { if (!\is_dir($path)) {
Directory::create($path, 0655, true); Directory::create($path, 0755, true);
} }
if (!\is_uploaded_file($f['tmp_name'])) { if (!\is_uploaded_file($f['tmp_name'])) {

View File

@ -2,7 +2,7 @@
<header><h1><?= $this->getHtml('Media') ?></h1></header> <header><h1><?= $this->getHtml('Media') ?></h1></header>
<div class="inner"> <div class="inner">
<form> <form id="<?= $this->form; ?>-upload">
<table class="layout wf-100"> <table class="layout wf-100">
<tbody> <tbody>
<tr><td><label for="iMedia"><?= $this->getHtml('Media') ?></label> <tr><td><label for="iMedia"><?= $this->getHtml('Media') ?></label>
@ -14,7 +14,7 @@
<tr><td><label for="iUpload"><?= $this->getHtml('Upload', 'Media') ?></label> <tr><td><label for="iUpload"><?= $this->getHtml('Upload', 'Media') ?></label>
<tr><td> <tr><td>
<input type="file" id="iUpload" name="upload" form="<?= $this->form; ?>" multiple> <input type="file" id="iUpload" name="upload" form="<?= $this->form; ?>" multiple>
<input form="<?= $this->form; ?>" type="hidden" name="type"><td> <input form="<?= $this->form; ?>" type="hidden" name="media-list"><td>
</table> </table>
</form> </form>
</div> </div>