UEditor1.4.3實現跨域上傳到獨立文件服務器,完美解決單文件和多文件上傳!

在寫配置方法以前先吐槽一下網上的各類教程,TM沒一個有卵用,一羣傻屌不會寫就別寫,寫了就要負責。javascript

百度google搜了半天,全是配置什麼document.domain,根域名什麼的,我只想對你說:html

好了,talk is cheap show me the code,言歸正傳:html5

首先去ue官網下載1.43版 .net版本,解壓以後,把demo文件夾改爲web,把net那個文件夾拷貝出來放到web外面,如圖:java

這樣就把編輯器的靜態文件和動態文件分離了,動態部分放到文件服務器上,靜態部分集成到咱們的網站上。web

下面我就用c.com綁定到web目錄,d.com綁定到net目錄(a、b.com我在測試的時候用了)。
先在本地IIS建立兩個站點,如圖設置:json

接下來要設置Hosts才能訪問,這是模擬的綁定域名,打開C:\Windows\System32\drivers\etc找到hosts文件,用記事本打開在文件末尾增長兩行:跨域

127.0.0.1 c.com
127.0.0.1 d.com瀏覽器

保存後在瀏覽器上訪問c、d.com就能訪問到本地iis了,若是不能保存就先右鍵hosts文件添加user用戶權限設置爲可修改就能保存了。緩存

 

接下來打開c.com下面的index.html文件,把它裏面的代碼該刪的刪一下,工具欄從新設置一下保留用獲得上傳功能的:安全

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>完整demo</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
    <script type="text/javascript" charset="utf-8" src="/ueditor.config.js"></script>
    <script type="text/javascript" charset="utf-8" src="/ueditor.all.js"> </script>
    <!--建議手動加在語言,避免在ie下有時由於加載語言失敗致使編輯器加載失敗-->
    <!--這裏加載的語言文件會覆蓋你在配置項目裏添加的語言類型,好比你在配置項目裏配置的是英文,這裏加載的中文,那最後就是中文-->
    <script type="text/javascript" charset="utf-8" src="/lang/zh-cn/zh-cn.js"></script>
</head>
<body>
<div>
    <h1>跨域上傳</h1>
    <script id="editor" type="text/plain" style="width:1024px;height:500px;"></script>
</div>
<script type="text/javascript">
    //實例化編輯器
    //建議使用工廠方法getEditor建立和引用編輯器實例,若是在某個閉包下引用該編輯器,直接調用UE.getEditor('editor')就能拿到相關的實例
    var ue = UE.getEditor('editor', {
        toolbars: [[
                'source',
                'simpleupload', //單圖上傳
                'insertimage', //多圖上傳]
                'attachment', //附件
                'scrawl', //塗鴉
                'wordimage', //圖片轉存
                'insertvideo'//上傳你視頻
            ]]
    });
</script>
</body>
</html>

最終效果:

 

接下來打開c.com下面的ueditor.config.js, 找到:, serverUrl: URL + "net/controller.ashx"改爲:, serverUrl: "http://d.com/controller.ashx" 

接下來你打開瀏覽器調試,刷新頁面就看獲得請求d.com下面的controller.ashx獲取上傳參數了。【後面測試儘可能用ctrl+f5刷新頁面測試,不行就試試清除緩存】

如今你能夠測試一下上傳,此時單文件上傳是能上傳成功的,d.com下面已經有文件了,可是不能返回地址;多文件上傳和塗鴉等上傳失敗,要報錯:

XMLHttpRequest cannot load http://d.com/controller.ashx?action=uploadimage&encode=utf-8. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://c.com' is therefore not allowed access.

這裏有必要先提一下,ue的單文件上傳是form提交到iframe,而後檢測iframe裏面的內容來返回結果,官方已經明確說明了單文件上傳不能實現跨域上傳,就是由於跨域的iframe是獲取不到iframe裏面的html代碼的,因此如今不能得到上傳地址,後面我有辦法解決。而多文件上傳和塗鴉這些用的是flash上傳或者html5上傳,這個就要用跨域的方法來解決,接下來先解決這個問題。

進入d.com目錄下面。打開config.json,搜索 UrlPrefix": "/ueditor/net/",  所有改爲 UrlPrefix": "http:/d.com/",  這是圖片上傳成功後的地址前綴,讓它返回http://d.com/xxxx/xx/jpg。

接下來根據ue官方的文檔是要在文件服務器上的controller.ashx裏面添加header: Access-Control-Allow-Origin等,根據個人測試,卵用都沒得!!要在iis上添加才行,別問我爲何,我也不曉得。

添加這兩個就好了:

Access-Control-Allow-Origin:* (*表示任何域名,若是填寫具體的域名的話,用http開頭)
Access-Control-Allow-Headers:X-Requested-With,X_Requested_With

好了,如今來測試一下多圖上傳,成功了有木有!!塗鴉也能保存了!

不過如今單文件上傳仍是不能跨域,由於他是提交到iframe的方式,要實現跨域還得費點周章。

好了,實現單文件跨域上傳。首先要搞懂它的原理,它是提交到iframe去上傳,而後監控iframe加載完成後js獲取iframe裏面的內容也就是json結果來獲得圖片上傳結果。而跨域上傳iframe裏面的頁面和當前頁面不是同一個域名就獲取不到json了,官方說暫時不支持,其實so easy,用傳統的代理頁面來解決,就是文件服務器上傳成功後,不直接顯示結果,而是跳轉到c.com下面來的result.ashx頁面來,把結果傳遞到這個頁面上,再輸出來,這樣iframe就在同一個域名上了,js就能直接獲取iframe裏面的內容了。

首先在c.com下面添加result.ashx:

<%@ WebHandler Language="C#" Class="UEditorHandler" %>

using System;
using System.Web;
using System.IO;
using System.Collections;

public class UEditorHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        var result=context.Request["result"];
        //固然這裏最好判斷一下result是否安全,不要接收到內容就顯示這樣會被人利用。
        if(result!=null)
            context.Response.Write(result.ToString());
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

由於只有單圖上傳(也就是簡單文件上傳)要用iframe方式,因此咱們要判斷一下,只有簡單文件上傳才用這種方式。打開ueditor.all.js或者ueditor.all.min.js你頁面上調用哪一個就打開哪一個,搜索<input id="edui_input_  在</form>以前加上:
<input type="hidden" name="issimpleupload" value="true" /> 這樣上傳後咱們好經過獲取issimpleupload來判斷是否是簡單文件上傳。

初始化編輯器頁面你調用哪一個就加哪一個頁面,兩個加上也成。

 

而後改d.com的處理文件:app_code裏面的Handler.cs打開,第28行的大括號裏面加上判斷:

if (String.IsNullOrWhiteSpace(jsonpCallback))
        {
            var issimple = Request["IsSimpleUpload"];
            if (issimple != null && issimple.ToString()=="true")
            {
                Response.Redirect("http://c.com/result.ashx?result=" + json); //把json傳遞到c.com下面去呈現結果。 }
            Response.AddHeader("Content-Type", "text/plain");
            Response.Write(json);
        }

 

 

到這裏就特麼大功告成了!!!

ue真心好用啊,尤爲是針對我的站長,百度搜圖,搜音樂,塗鴉,粘貼內容直接下載遠程圖片,文章內容分頁等功能就是爲站長量身訂作的。

惟一的遺憾就是沒有內容分頁設置分頁標題,不過我已經把分頁標題擴展上去了。

相關文章
相關標籤/搜索