<!DOCTYPE html>
< html lang = "zh" >
< head >
< meta charset = "utf-8" / >
< title > 图片跨域上传示例 - Editor.md examples< / title >
< link rel = "stylesheet" href = "css/style.css" / >
< link rel = "stylesheet" href = "../css/editormd.css" / >
< link rel = "shortcut icon" href = "https://pandao.github.io/editor.md/favicon.ico" type = "image/x-icon" / >
< / head >
< body >
< div id = "layout" style = "height: 2000px;background: #f6f6f6;" >
< header >
< h1 > 图片跨域上传示例< / h1 >
< p > Image cross-domain upload example.< / p >
< / header >
< div id = "test-editormd" >
< textarea style = "display:none;" > #### Settings
```javascript
{
imageUpload : true,
imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
imageUploadURL : "http://xxxxxxx/editor.md/examples/php/cross-domain-upload.php?test=dfdf",
imageUploadFields : "< input type=\"hidden\" name=\"token\" value=\"d3sE3fc87\"/> ", // v1.5.1+
crossDomainUpload : true,
uploadCallbackURL : "http://xxxxxx/upload_callback.html?test=dfdf",
imageUploadCallback : function (result, dialog) { // v1.5.1+
console.log('imageUploadCallback: ', this, result, dialog);
}
}
```
#### 跨域上传原理
利用 iframe 来实现,A 站 POST 到 B 站,B 站处理上传后再跳转回到 A 站的 callback 页面,callback 页面此时在 iframe 内(即同域下),再通过 window.parent 就可以操作父页面的任意元素了。
#### 跨域上传示例 PHP 版
当前域名:blog.xxx.com/post.php
```html
< form method="post" target="upload-iframe" enctype="multipart/form-data" action="http://static.xxx.com/uploader.php?callback=http://blog.xxx.com/upload-callback.html">
< input type="file" name="file" accept="image/*" />
< input type="submit" id="submit" value="开始上传" />
< /form>
< iframe name="upload-iframe" style="display:none;" frameborder="0"> < /iframe>
```
图片服务器:static.xxx.com/uploader.php
```php
< ?php
header("Access-Control-Allow-Origin: *"); // Setting allow domian name
$file = 'uploads/' . $_FILES['file']['name'];
// 详细过程略
move_uploaded_file($_FILES['file']['tmp_name'], $file);
$location = $_GET['callback'].'?success=1&message=xxxxxxx&url=http://static.xxx.com/2015/02/15'.$file.'&temp='.date('ymdhis');
header('location:' . $location);
exit;
?>
```
当前域名:blog.xxx.com/upload-callback.html
```html
< script type="text/javascript">
var query = {};
var urlParams = window.location.search.split('?')[1];
urlParams = urlParams.split("&");
for (var i = 0; i< urlParams.length; i++) {
var param = urlParams[i].split("=");
query[param[0]] = param[1];
}
var imageDialog = window.parent.document.getElementById(query['dialog_id']);
//console.log(imageDialog, window.parent.document, window.parent, query);
if (query['callback_handler']) {
try {
window.parent[query['callback_handler']](query, imageDialog);
} catch (e) {
console.error('upload_callback: callback_handler =>', e);
}
}
< /script>
```< / textarea >
< / div >
< / div >
< script src = "js/jquery.min.js" > < / script >
< script src = "../editormd.js" > < / script >
< script type = "text/javascript" >
$(function() {
var testEditor = editormd("test-editormd", {
width : "90%",
height : 640,
markdown : "",
path : '../lib/',
imageUpload : true,
imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
imageUploadURL : "http://127.0.0.1/editor.md/examples/php/cross-domain-upload.php?test=dfdf",
imageUploadFields : "< input type = \"hidden\" name = \"token\" value = \"d3sE3fc87\"/ > ", // append upload form fields for CRSF etc. Server-side receives the POST parameters. v1.5.1+
crossDomainUpload : true,
uploadCallbackURL : "http://localhost/editor.md/examples/php/upload_callback.html?test=dfdf",
imageUploadCallback : function (result, dialog) { // v1.5.1+
console.log('imageUploadCallback: ', this, result, dialog);
}
/*
跨域时,上传的图片服务器后台只需要返回一个跳转 URL 并跳转到原页面同域下的 callback 页面,结构如下:
{
success : 0 | 1, // 0 表示上传失败,1 表示上传成功
message : "提示的信息,上传成功或上传失败及错误信息等。",
dialog_id : $_GET['dialog_id'],
url : "远程图片地址" // 上传成功时才返回
}
*/
});
});
< / script >
< / body >
< / html >