问题
I'm using Responsive File Manager 9.14.0 with tinyMCE v 5 in a Laravel v 6 App - I followed a tutorial in doing the setup. Everything works fine apart from when the button 'Start upload' is clicked - I get this error: Unexpected token < in JSON at position 0. This is displayed in the page on the back end in the php error log I get these two errors.
[05-Mar-2020 12:08:17 Europe/Rome] PHP Notice: Trying to access array offset on value of type null in /var/www/html/laratest/public/tinymce/filemanager/UploadHandler.php on line 496
[05-Mar-2020 12:08:17 Europe/Rome] PHP Notice: Trying to access array offset on value of type null in /var/www/html/laratest/public/tinymce/filemanager/UploadHandler.php on line 1429.
What is strange is that the error does not occur with large files. Also what is strange is that even though this error is given it stills downloads the file okay. Here my tinymce config
tinymce.init({
selector: 'textarea',
plugins: 'image code a11ychecker advcode casechange formatpainter linkchecker lists checklist media mediaembed pageembed permanentpen powerpaste table advtable tinymcespellchecker',
toolbar: ' link image casechange checklist code formatpainter pageembed permanentpen table',
image_title: true,
automatic_uploads: true,
file_picker_types: 'image',
external_filemanager_path:"{{url('tinymce/filemanager')}}/",
filemanager_title:"Responsive Filemanager" ,
external_plugins: { "filemanager" : "{{url('tinymce')}}/filemanager/plugin.min.js"},
});
回答1:
The problem is on line 496 and line 1429 in the file UploadHandler.php
//////////////////////////////////////////////////////////////////////////////////
Code around line 496
////////////////////////////////////////////////////////////////////////////////
protected function get_unique_filename($file_path, $name, $size, $type, $err
or,
$index, $content_range) {
while(is_dir($this->get_upload_path($name))) {
$name = $this->upcount_name($name);
}
// Keep an existing filename if this is part of a chunked upload:
//BELOW is line 496
$uploaded_bytes = $this->fix_integer_overflow((int)$content_range[1]);
while (is_file($this->get_upload_path($name))) {
if ($uploaded_bytes === $this->get_file_size(
$this->get_upload_path($name))) {
break;
}
$name = $this->upcount_name($name);
}
return $name;
}
//////////////////////////////////////////////////////////////////////////////////
And the code around line 1429
/////////////////////////////////////////////////////////////////////////////////
$response = array($this->options['param_name'] => $files);
$name = $file_name ? $file_name : $upload['name'][0];
$res = $this->generate_response($response, $print_response);
if(is_file($this->get_upload_path($name))){
// BELOW IS LINE 1429
$uploaded_bytes = $this->fix_integer_overflow((int)$content_range[1]);
$totalSize = $this->get_file_size($this->get_upload_path($name));
if ($totalSize - $uploaded_bytes - $this->options['readfile_chunk_size'] < 0) {
$this->onUploadEnd($res);
}else{
$this->head();
$this->body(json_encode($res));
}
}else{
$this->head();
$this->body(json_encode($res));
}
The problem is with the value of $content_range[1] when the file being uploaded is not being chunked. The value of $content_range[1] needs to be checked to see if its set.
Below is the solution to the two extracts of code that have been throwing the error. First the code around line 496
protected function get_unique_filename($file_path, $name, $size, $type, $error,
$index, $content_range) {
while(is_dir($this->get_upload_path($name))) {
$name = $this->upcount_name($name);
}
// Keep an existing filename if this is part of a chunked upload:
if(isset($content_range[1])){
$uploaded_bytes = $this->fix_integer_overflow((int)$content_range[1]);
}
while (is_file($this->get_upload_path($name))) {
if(isset($uploaded_bytes)){
if ($uploaded_bytes === $this->get_file_size(
$this->get_upload_path($name))) {
break;
}
}
$name = $this->upcount_name($name);
}
return $name;
}
And the second bit code around 1429.
$response = array($this->options['param_name'] => $files);
$name = $file_name ? $file_name : $upload['name'][0];
$res = $this->generate_response($response, $print_response);
if(is_file($this->get_upload_path($name))){
if(isset($content_range[1])){
$uploaded_bytes = $this->fix_integer_overflow((int)$content_range[1]);
}
else{
$uploaded_bytes = 0;
}
$totalSize = $this->get_file_size($this->get_upload_path($name));
if ($totalSize - $uploaded_bytes - $this->options['readfile_chunk_size'] < 0) {
$this->onUploadEnd($res);
}else{
$this->head();
$this->body(json_encode($res));
}
}else{
$this->head();
$this->body(json_encode($res));
}
return $res;
来源:https://stackoverflow.com/questions/60544865/responsive-file-manager-and-tinymce