jquery/php如何上传序列化图片数据?
How to upload serialized image data in jquery/php?
我正在尝试使用 OpenCart 3
中的 http://scottcheng.github.io/cropit/
扩展裁剪然后上传图像。但是不知道怎么上传序列化图片数据
这是代码的 HTML 部分,实际上是 Cropit 扩展的代码:
<form action="#">
<div class="image-editor">
<input type="file" class="cropit-image-input">
<div class="cropit-preview"></div>
<div class="image-size-label">
Resize image
</div>
<input type="range" class="cropit-image-zoom-input">
<input type="hidden" name="image-data" class="hidden-image-data" />
<button type="submit"><i class="fa fa-upload"></i> Submit</button>
</div>
</form>
<div id="result">
<code>$form.serialize() =</code>
<code id="result-data"></code>
</div>
和 JQuery / Ajax 脚本:
<script>
$(function() {
$('.image-editor').cropit();
$('form').submit(function() {
// Move cropped image data to hidden input
var imageData = $('.image-editor').cropit('export');
$('.hidden-image-data').val(imageData);
// Print HTTP request params
var formValue = $(this).serialize();
$('#result-data').text(formValue);
// ^ the codes of Cropit extension
// v the codes of PHP/OC3 for uploading images
$('#form-upload').remove();
$('body').prepend('<form enctype="multipart/form-data" id="form-upload" style="display: none;"><input type="file" name="file[]" value="" multiple="multiple" /></form>');
if (typeof timer != 'undefined') {
clearInterval(timer);
}
timer = setInterval(function() {
if (imageData != '') {
clearInterval(timer);
$.ajax({
url: 'index.php?route=common/filemanager/upload&user_token={{ user_token }}&directory={{ directory }}',
type: 'post',
dataType: 'json',
data: FormData(formValue), //new FormData($('#form-upload')[0]),
cache: false,
contentType: false,
processData: false,
beforeSend: function() {
$('#button-upload i').replaceWith('<i class="fa fa-circle-o-notch fa-spin"></i>');
$('#button-upload').prop('disabled', true);
},
complete: function() {
$('#button-upload i').replaceWith('<i class="fa fa-upload"></i>');
$('#button-upload').prop('disabled', false);
},
success: function(json) {
if (json['error']) {
alert(json['error']);
}
if (json['success']) {
alert(json['success']);
$('#button-refresh').trigger('click');
}
},
error: function(xhr, ajaxOptions, thrownError) {
alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
}
});
}
}, 500);
// Prevent the form from actually submitting
return false;
});
});
</script>
有趣的是,点击“提交”按钮后页面会显示 successful image upload
消息,但实际上并未上传文件。
更新:更多信息
这里是 PHP 上传功能:
<?php
public function upload() {
$json = array();
// Make sure we have the correct directory
if (isset($this->request->get['directory'])) {
$directory = rtrim(DIR_IMAGE . 'catalog/' . $store_folder_slash . $this->request->get['directory'], '/');
} else {
$directory = DIR_IMAGE . 'catalog' . $store_slash_folder;
}
// Check its a directory
if (!is_dir($directory) || substr(str_replace('\', '/', realpath($directory)), 0, strlen(DIR_IMAGE . 'catalog' . $store_slash_folder)) != str_replace('\', '/', DIR_IMAGE . 'catalog' . $store_slash_folder)) {
$json['error'] = $this->language->get('error_directory');
}
if (!$json) {
// Check if multiple files are uploaded or just one
$files = array();
// if (!empty($this->request->files['file']['name']) && is_array($this->request->files['file']['name'])) {
// foreach (array_keys($this->request->files['file']['name']) as $key) {
// $files[] = array(
// 'name' => $this->request->files['file']['name'][$key],
// 'type' => $this->request->files['file']['type'][$key],
// 'tmp_name' => $this->request->files['file']['tmp_name'][$key],
// 'error' => $this->request->files['file']['error'][$key],
// 'size' => $this->request->files['file']['size'][$key]
// );
// }
// }
// foreach ($files as $file) {
// if (is_file($file['tmp_name'])) {
if ($this->request->server['REQUEST_METHOD'] == 'POST') {
// Sanitize the folder name
$encoded = html_entity_decode($this->request->post['data'], ENT_QUOTES, 'UTF-8');
//decode the url, because we want to use decoded characters to use explode
$decoded = urldecode($encoded);
//explode at ',' - the last part should be the encoded image now
$exp = explode(',', $decoded);
//we just get the last element with array_pop
$base64 = array_pop($exp);
//decode the image and finally save it
$data = base64_decode($base64);
if (is_file($data)) {
// Sanitize the filename
$filename = basename('test.jpg');
//$filename = basename(html_entity_decode($file['name'], ENT_QUOTES, 'UTF-8'));
if (!in_array(utf8_strtolower(utf8_substr(strrchr($filename, '.'), 1)), $allowed)) {
$json['error'] = $this->language->get('error_filetype');
}
} else {
$json['error'] = $this->language->get('error_upload');
}
if (!$json) {
//move_uploaded_file($file, $directory . '/' . $filename);
file_put_contents($data, $directory . '/' . $filename);
}
}
}
if (!$json) {
$json['success'] = $this->language->get('text_uploaded');
}
$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode($json));
}
哪个return这个错误:
PHP Warning: is_file() expects parameter 1 to be a valid path, string given
不知道怎么算!
终于找到问题并解决了!
问题是 AJAX 使用 data: 'data=' + imageData,
发送数据。我将其更改为:data: {base64data : imageData}
$.ajax({
url: 'index.php?route=common/filemanager/upload&user_token={{ user_token }}&directory={{ directory }}',
type: 'post',
dataType: 'json',
data: {base64data : imageData},
...
我正在尝试使用 OpenCart 3
中的 http://scottcheng.github.io/cropit/
扩展裁剪然后上传图像。但是不知道怎么上传序列化图片数据
这是代码的 HTML 部分,实际上是 Cropit 扩展的代码:
<form action="#">
<div class="image-editor">
<input type="file" class="cropit-image-input">
<div class="cropit-preview"></div>
<div class="image-size-label">
Resize image
</div>
<input type="range" class="cropit-image-zoom-input">
<input type="hidden" name="image-data" class="hidden-image-data" />
<button type="submit"><i class="fa fa-upload"></i> Submit</button>
</div>
</form>
<div id="result">
<code>$form.serialize() =</code>
<code id="result-data"></code>
</div>
和 JQuery / Ajax 脚本:
<script>
$(function() {
$('.image-editor').cropit();
$('form').submit(function() {
// Move cropped image data to hidden input
var imageData = $('.image-editor').cropit('export');
$('.hidden-image-data').val(imageData);
// Print HTTP request params
var formValue = $(this).serialize();
$('#result-data').text(formValue);
// ^ the codes of Cropit extension
// v the codes of PHP/OC3 for uploading images
$('#form-upload').remove();
$('body').prepend('<form enctype="multipart/form-data" id="form-upload" style="display: none;"><input type="file" name="file[]" value="" multiple="multiple" /></form>');
if (typeof timer != 'undefined') {
clearInterval(timer);
}
timer = setInterval(function() {
if (imageData != '') {
clearInterval(timer);
$.ajax({
url: 'index.php?route=common/filemanager/upload&user_token={{ user_token }}&directory={{ directory }}',
type: 'post',
dataType: 'json',
data: FormData(formValue), //new FormData($('#form-upload')[0]),
cache: false,
contentType: false,
processData: false,
beforeSend: function() {
$('#button-upload i').replaceWith('<i class="fa fa-circle-o-notch fa-spin"></i>');
$('#button-upload').prop('disabled', true);
},
complete: function() {
$('#button-upload i').replaceWith('<i class="fa fa-upload"></i>');
$('#button-upload').prop('disabled', false);
},
success: function(json) {
if (json['error']) {
alert(json['error']);
}
if (json['success']) {
alert(json['success']);
$('#button-refresh').trigger('click');
}
},
error: function(xhr, ajaxOptions, thrownError) {
alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
}
});
}
}, 500);
// Prevent the form from actually submitting
return false;
});
});
</script>
有趣的是,点击“提交”按钮后页面会显示 successful image upload
消息,但实际上并未上传文件。
更新:更多信息
这里是 PHP 上传功能:
<?php
public function upload() {
$json = array();
// Make sure we have the correct directory
if (isset($this->request->get['directory'])) {
$directory = rtrim(DIR_IMAGE . 'catalog/' . $store_folder_slash . $this->request->get['directory'], '/');
} else {
$directory = DIR_IMAGE . 'catalog' . $store_slash_folder;
}
// Check its a directory
if (!is_dir($directory) || substr(str_replace('\', '/', realpath($directory)), 0, strlen(DIR_IMAGE . 'catalog' . $store_slash_folder)) != str_replace('\', '/', DIR_IMAGE . 'catalog' . $store_slash_folder)) {
$json['error'] = $this->language->get('error_directory');
}
if (!$json) {
// Check if multiple files are uploaded or just one
$files = array();
// if (!empty($this->request->files['file']['name']) && is_array($this->request->files['file']['name'])) {
// foreach (array_keys($this->request->files['file']['name']) as $key) {
// $files[] = array(
// 'name' => $this->request->files['file']['name'][$key],
// 'type' => $this->request->files['file']['type'][$key],
// 'tmp_name' => $this->request->files['file']['tmp_name'][$key],
// 'error' => $this->request->files['file']['error'][$key],
// 'size' => $this->request->files['file']['size'][$key]
// );
// }
// }
// foreach ($files as $file) {
// if (is_file($file['tmp_name'])) {
if ($this->request->server['REQUEST_METHOD'] == 'POST') {
// Sanitize the folder name
$encoded = html_entity_decode($this->request->post['data'], ENT_QUOTES, 'UTF-8');
//decode the url, because we want to use decoded characters to use explode
$decoded = urldecode($encoded);
//explode at ',' - the last part should be the encoded image now
$exp = explode(',', $decoded);
//we just get the last element with array_pop
$base64 = array_pop($exp);
//decode the image and finally save it
$data = base64_decode($base64);
if (is_file($data)) {
// Sanitize the filename
$filename = basename('test.jpg');
//$filename = basename(html_entity_decode($file['name'], ENT_QUOTES, 'UTF-8'));
if (!in_array(utf8_strtolower(utf8_substr(strrchr($filename, '.'), 1)), $allowed)) {
$json['error'] = $this->language->get('error_filetype');
}
} else {
$json['error'] = $this->language->get('error_upload');
}
if (!$json) {
//move_uploaded_file($file, $directory . '/' . $filename);
file_put_contents($data, $directory . '/' . $filename);
}
}
}
if (!$json) {
$json['success'] = $this->language->get('text_uploaded');
}
$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode($json));
}
哪个return这个错误:
PHP Warning: is_file() expects parameter 1 to be a valid path, string given
不知道怎么算!
终于找到问题并解决了!
问题是 AJAX 使用 data: 'data=' + imageData,
发送数据。我将其更改为:data: {base64data : imageData}
$.ajax({
url: 'index.php?route=common/filemanager/upload&user_token={{ user_token }}&directory={{ directory }}',
type: 'post',
dataType: 'json',
data: {base64data : imageData},
...