**首先,wangEditor的跨域上傳已經不再支持 IE8、9 瀏覽器。**
----
IE10 及以上瀏覽器在使用跨域上傳時,需要服務器端的配合,對`response`設置以下`head`信息:
```js
response.setHeader("Access-Control-Allow-Origin", "http://localhost:8011"); // 第二個參數填寫允許跨域的域名稱,不建議直接寫 "*"
response.setHeader("Access-Control-Allow-Headers", "X-Requested-With");
response.setHeader("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
// 接收跨域的cookie
response.setHeader("Access-Control-Allow-Credentials", "true");
```
**注意,各個后臺語言針對`response`設置`head`信息時,語法可能不同,以上代碼是nodejs的設置方式,其他語言請自行修改。**
如果你以上配置都成功了,并且成功實現了跨域上傳,可在瀏覽器的http請求中看到這些head設置信息,如下圖:

----
以下是一個具體的實例,例如我的前端頁面是`localhost:8011`端口,而我的服務器端的上傳地址是`http://localhost:8012/upload`。
那么我前端頁面中針對編輯器的配置是:
```js
var editor = new wangEditor('editor-trigger');
// 跨域上傳
editor.config.uploadImgUrl = 'http://localhost:8012/upload';
// 可以自定義配置 xhr.withCredentials (默認為 true)
editor.config.withCredentials = false;
// 創建編輯器
editor.create();
```
后端代碼示例如下(使用 nodejs 編寫,[點擊這里](https://github.com/wangfupeng1988/wangEditor/blob/master/server-for-cros.js)查看線上源碼):
```js
// 以下是實現跨域的服務器端示例代碼:
// ------------------------------------------------
// nodejs API 參考:http://nodeapi.ucdok.com/#/api/
// 需要本地安裝 formidable ,參見 https://github.com/felixge/node-formidable
var formidable = require('formidable');
var http = require('http');
var fs = require('fs');
var url = require('url');
var path = require('path');
// 文件將要上傳到哪個文件夾下面
var uploadfoldername = 'uploadfiles';
var uploadfolderpath = __dirname + '/' + uploadfoldername;
// var server = '192.168.1.2';
var server = 'localhost';
var port = 8012;
http.createServer(function (req, res) {
var reqMethod = req.method.toLowerCase();
// ----------------------用 '/upload' 這個路由來處理文件上傳----------------------
if (req.url === '/upload' && (reqMethod === 'post' || reqMethod === 'options')) {
// 設置允許跨域的域名稱
res.setHeader("Access-Control-Allow-Origin", "http://localhost:8011");
res.setHeader("Access-Control-Allow-Headers", "X-Requested-With");
res.setHeader("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
// ----- 情況1:跨域時,先發送一個options請求,此處要返回200 -----
if (reqMethod === 'options') {
console.log('options 請求時,返回 200');
// 返回結果
res.writeHead(200, {
'Content-type': 'text/html'
});
res.end('options OK');
return;
}
// ----- 情況2:發送post請求,上傳圖片 -----
console.log('定位到 /upload 路由');
// 使用第三方的 formidable 插件初始化一個 form 對象
var form = new formidable.IncomingForm();
// 處理 request
form.parse(req, function (err, fields, files) {
if (err) {
return console.log('formidable, form.parse err');
}
console.log('formidable, form.parse ok');
var item;
// 計算 files 長度
var length = 0;
for (item in files) {
length++;
}
if (length === 0) {
console.log('files no data');
return;
}
for (item in files) {
var file = files[item];
// formidable 會將上傳的文件存儲為一個臨時文件,現在獲取這個文件的目錄
var tempfilepath = file.path;
// 獲取文件類型
var type = file.type;
// 獲取文件名,并根據文件名獲取擴展名
var filename = file.name;
var extname = filename.lastIndexOf('.') >= 0
? filename.slice(filename.lastIndexOf('.') - filename.length)
: '';
// 文件名沒有擴展名時候,則從文件類型中取擴展名
if (extname === '' && type.indexOf('/') >= 0) {
extname = '.' + type.split('/')[1];
}
// 將文件名重新賦值為一個隨機數(避免文件重名)
filename = Math.random().toString().slice(2) + extname;
// 構建將要存儲的文件的路徑
var filenewpath = uploadfolderpath + '/' + filename;
// 將臨時文件保存為正式的文件
fs.rename(tempfilepath, filenewpath, function (err) {
// 存儲結果
var result = '';
if (err) {
// 發生錯誤
console.log('fs.rename err');
result = 'error|save error';
} else {
// 保存成功
console.log('fs.rename done');
// 拼接圖片url地址
result = 'http://' + server + ':' + port + '/' + uploadfoldername + '/' + filename;
}
// 返回結果
res.writeHead(200, {
'Content-type': 'text/html'
});
res.end(result);
}); // fs.rename
} // for in
});
} else {
// ---------------------- 其他路由,直接作為靜態文件返回,如通過url獲取圖片 ----------------------
var pathname = url.parse(req.url).pathname;
var filepath = path.join(__dirname, pathname);
fs.readFile(filepath, function (err, file) {
if (err) {
res.writeHead(404);
console.log('response file error: ' + filepath);
res.end('404 NOT FOUND...');
return;
}
if (filepath.slice(filepath.lastIndexOf('.') - filepath.length) === '.css') {
// 兼容IE
res.writeHead('200', {'Content-type': 'text/css'});
} else {
res.writeHead('200');
}
console.log('response file success: ' + filepath);
res.end(file);
});
}
}).listen(port);
// 監聽 localhost port 端口
console.log('server start at http://' + server + ':' + port);
```
**注意,**請看源碼中這塊代碼:
```js
// ----- 情況1:跨域時,先發送一個options請求,此處要返回200 -----
if (reqMethod === 'options') {
console.log('options 請求時,返回 200');
// 返回結果
res.writeHead(200, {
'Content-type': 'text/html'
});
res.end('options OK');
return;
}
```
瀏覽器在跨域上傳時,會先發送一個`options`的請求,來驗證瀏覽器是否可以支持跨域,然后再發送一個`post`請求來上傳文件。如果你在使用過程中遇到了類似的問題,可做參考。
- 關于wangEditor
- 遇到問題如何解決和提問【重要】
- 開始使用
- 下載
- 創建頁面
- 生成編輯器(使用ID)
- 生成編輯器(使用element)
- 調整尺寸
- 銷毀與恢復
- 一個頁面多個編輯器
- 內容處理
- 初始化內容
- 獲取內容
- 追加內容
- 清空內容
- 用 editor.$txt 做其他內容處理
- onchange事件
- 禁用/啟用
- 參數配置
- 自定義菜單
- 自定義顏色、字體、字號
- 自定義表情
- 切換語言
- 百度地圖key
- 菜單欄吸頂
- 配置全屏的z-index
- 關閉瀏覽器打印log
- 關閉過濾javascript
- 關閉粘貼過濾樣式
- 只粘貼純文本
- 插入代碼-配置默認語言
- 自定義編輯器樣式
- 自定義顏色
- 自定義菜單UI
- 自定義表格、引用、代碼的樣式
- 代碼高亮樣式
- 圖片上傳
- 使用前必讀
- 支持情況
- 配置說明
- log提示輔助排錯
- 后臺代碼示例
- C#
- java - 例1
- java - 例2
- php
- nodejs
- python
- 自定義上傳事件
- 集成plupload插件
- 集成七牛云存儲
- 跨域上傳
- 上傳圖片出錯時的解決步驟
- 使用模塊定義
- 使用require.js
- 使用seajs
- 使用webpack
- 插件開發
- 對象結構
- 常用API
- 全局API
- 對象API
- 基礎API
- 選區API
- 命令API
- 擴展一個菜單
- 『縮進』菜單
- 『行高』菜單
- 『插入符號』菜單
- 開發一個插件
- 常見問題
- 關于markdown
- 關于上傳附件
- 關于背景圖片
- 關于顯示壓縮圖片
- 集成到React
- 集成到angular
- 集成到vue.js
- 如何避免與項目中的css沖突
- xss過濾
- 如何插入視頻鏈接
- 關于mobile端編輯器
- 查看源碼第一行有空格