wangeditor 请求头_跨域上传 · wangEditor2使用手册 · 看云
**首先,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设置信息,如下图:
![](https://box.kancloud.cn/2016-03-21_56ef6c54d06f7.png)
----
以下是一个具体的实例,例如我的前端页面是`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 请求头_跨域上传 · wangEditor2使用手册 · 看云相关推荐
- wangeditor 请求头_wangEditor编辑器添加上传视频功能
正在帮一个朋友的项目进行一些修改,该项目中使用的是 wangEditor 富文本编辑器. 该编辑器的上传视频有个缺陷,不能手动上传,这是目前的效果图 朋友要求加一个上传视频的功能. 网上的解决方案的文 ...
- java 跨域上传_java使用webuploader实现跨域上传详解
前言 项目中使用webuploader进行文件上传,需要用到跨域,查看webuploader的issues发现是支持上传的,但是他们写的回复都是不清不白的,有点迷糊:想了半天才知道咋回事,也可能是我比 ...
- 全网最直接简单。百度富文本跨域上传文件到文件服务器
看了很多文章其实也有很多办法,实现跨域上传.现在讲我目前所用的方法.只实现的多图上传.单图上传失败. 接下来必须认真的看完文章. 当前我用的 版本为UEditor1.4.3. 这里主要是实现重写接收文 ...
- php js跨域上传文件,Jquery实现跨域异步上传文件步骤详解
这次给大家带来Jquery实现跨域异步上传文件步骤详解,Jquery实现跨域异步上传文件的注意事项有哪些,下面就是实战案例,一起来看一下. 先说明白 这个跨域异步上传功能我们借助了Jquery.for ...
- 解决使用elementUI框架el-upload跨域上传时session丢失问题
解决使用elementUI框架el-upload跨域上传时session丢失问题 参考文章: (1)解决使用elementUI框架el-upload跨域上传时session丢失问题 (2)https: ...
- springboot上传图片到宝塔Linux(本地上传和跨域上传)
1.浏览器访问宝塔面板的图片需要的配置-- 点击文件www-->server-->tomcat-->conf-->server.xml 可以自己修改,请在宝塔面板和服务器上放 ...
- wangeditor 请求头_富文本编辑框wangEditor
由于项目需要,在网上找了个富文本编辑框wangEditor,抱着试一试的态度用了一下,原以为这款个人开发维护的插件会有不少bug,使用之后经过我们测试人员全方位的测试检验,基本符合需求,并且较之前使用 ...
- SpringMvc+ajax实现文件跨域上传
最近开始学习SpringMVC框架,在学习数据绑定的时候,发现可以使用@RequestParam注解绑定请求数据,实现了文件上传.但是如果一个项目是前后端分离的,前端系统向后端服务上传文件该怎么解决了 ...
- java后台图片跨域上传
跨域的原因 跨域的实现原理 本地服务器源码 图片服务器源码 测试 本地服务器 跨域的原因 在项目开发的过程中,我们经常需要用到图片上传操作,传统的做法是我们将其上传到项目的所在目录中,比如说项目的 ...
最新文章
- .net课堂流水账_20110118
- 慎重选型:PG还是MySQL?Uber的案例不能作为参考!
- XamarinEssentials教程设置首选项Preferences的值
- Sql Server相关报错解决
- 伯努利分布方差_统计知识(4)——分布
- Elasticsearch文档的CRUD
- vue-cli打包后怎么修改服务器地址实践有效
- 【README2】动态规划之斐波那契数列说明重叠子问题如何解决
- 实操Tiktok一个月告诉你,10万粉丝轻松拿下?
- java token身份认证_java – 基于Spring Security Token的身份验证
- python数据分析与挖掘实战pdf_《Python数据分析与挖掘实战》PDF+完整源码
- cadence软件下载linux,Red Hat Linux 9.0下安装Cadence IC5.0
- 金蝶服务器连接协议,k3金蝶客户端连接服务器配置
- 常用十六进制颜色对照表
- html5视频自动轮播,HTML5教程 可自动轮播的旋转木马插件
- 佳能打印机imageRUNNER系列 2206AD驱动安装
- 俄亥俄州立大学计算机专业排名,俄亥俄州立大学计算机工程全美专业排名
- 【理财】指数基金投资指南
- Dubbo Spring Cloud 逆向分析服务注册事件变化的处理过程
- 五种经典卷积神经网络
热门文章
- 《如何搭建小微企业风控模型》第十节 单变量分析(下)节选
- 树的合并 connect
- springmvc 静态资源 配置
- 封装scrollView 循环滚动,tableViewCell(连载) mvc
- 新手 Spring 疑惑
- Python xlwt : More than 4094 XFs (styles) 解决方法
- 自学Java第一周的总结
- 细谈最近上线的Vue2.0项目(一)
- Java的“影子克隆”和“深度克隆”
- 【转】【51CTO 网+】怎样做一款让用户来电的产品