获取中...

-

Just a minute...

粘贴图片并上传

最近在写博客的时候,纯MarkDown语法写,但是发现图片是个需求,需要经常截图并且写到MarkDown里面
之前的做法是用QQ截图,然后另存为到本地桌面,然后再上传,返回URI地址,贴到博客编辑器里面
最近发现有些页面支持图片粘贴上传的功能,研究了一番

1
2
3
<!-- #editDiv标签的</div>之前必须没有内容,才能匹配空#editDiv:empty -->
<div id="editDiv" contenteditable='true' placeholder='粘贴图片至此处'></div>
<div id="imgs"></div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#editDiv{
color:black;
width:100px;
height:100px;
border: 1px solid red;
margin: 20px 50%;
}
#editDiv:empty:before{
/* 标签闭合的时候,设置content,内容为attr placeholder里面的内容 */
content: attr(placeholder);
color:red;
}
/*焦点时内容为空*/
#editDiv:focus:before{
content:none;
}

这里有个浏览器属性,contenteditable,表示标签可以编辑,不能用input和textarea,因为input、textarea中只能接受字符串,对于html标签不进行转义以及渲染。
图片上传的是blob类型的流文件,固用div模拟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
let editDiv = document.getElementById('editDiv');//获取到粘贴图片的框
editDiv.addEventListener('paste',function(e){ //浏览器事件,paste表示粘贴内容
let cbd = e.clipboardData;//粘贴的内容,在控制台打印出来长度是0,但是实际上items可以用
for(let i=0;i<cbd.items.length;i++){
let item = cbd.items[i];
if(item.kind == "file"){
let blob = item.getAsFile();//粘贴数据的原生方法,转换成blob
let data = new FormData();
data.append('file', blob);//data就是一个二进制流
$.ajax({
url:'/upload.php',
type:'post',//
contentType: false,//不默认设置格式
processData: false,//不序列化,才能将blob文件发送过去
dataType:'json',//返回数据的类型
data:data,
success(res){
// res = {
// code: 1000
// content: "//static.nnnnzs.cn/upload/img/d2854133118bf60bc1e0d9fdc690bf35.png"
// msg: "上传成功"
// }
console.log(res.content)
if(res.code===1000){
$('#imgs').append(`<img src="${res.content}">`)
}
}
})
}
}
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$requestScheme = $_SERVER['REQUEST_SCHEME']; //协议
$host = $_SERVER['SERVER_NAME']; //同机器部署,
$baseUrl = $requestScheme . '://' . $host;

if ($_FILES["file"]["error"] > 0) {
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
} else if($_FILES["file"]) {
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp); // 获取文件后缀名
$fileType = $_FILES["file"]["type"];

//默认
$fileUrl = $baseUrl . "/upload/" . $_FILES["file"]["name"];//外网绝对路径
$absUrl = "upload/" . $_FILES["file"]["name"];//相对当前站点的路径

//如果是图片,文件名是md5
if(substr($fileType,0,5)==='image'){
$fileFullName = md5_file($_FILES["file"]["tmp_name"]).'.'.$extension;
$fileUrl = $baseUrl . "/upload/img/" . $fileFullName;
$absUrl = "upload/img/" .$fileFullName;
}
//移动到站点文件夹
move_uploaded_file(
$_FILES["file"]["tmp_name"],
$absUrl
);
$result = array('code' => 1000, 'content' => $fileUrl, 'msg' => '上传成功');
echo json_encode($result);

1
![截图](//static.nnnnzs.cn/upload/img/1813f4fea60c0f0d9383bd19011994c8.png)

其实在php文件里面,写了两套代码,当时浏览器访问的时候,get请求,返回页面渲染
post请求的时候,就是图片上传的代码

1
2
3
4
5
6
$method = $_SERVER["REQUEST_METHOD"];
if($method=='POST'){
//接口
}else{
//返回html页面
}

截图

完结撒花

相关文章
评论
分享
  • 离线上传方案

    有个需求需要断网环境下上传文件,在有网环境下提交附件需要提交到单独的文件服务器,返回文件服务器的id框架是element-ui 设计思路 利用浏览器自带的indexDB,存储blob数据 利用localStorage缓存表单数据,in...

    离线上传方案
  • 微任务宏任务

    微任务队列宏任务队列 javascript是单线程,多线程都是模拟出来的, script、setTimeOut、setInterval是宏任务 Promise,process.nextTick是微任务 setTimeOut是n毫秒之后...

    微任务宏任务
  • 花式log

    各种控制台输出常见的控制台打印12345678console.log() // 打印日志console.debug() // 打印调试console.error() // 打印错误console.info() // 打印...

    花式log
  • 只要不失去你的崇高整个世界就会向你敞开

    7 月 29 日周五,临下班之前问了一下领导,下周不会出差吧,这周我要回家领导说:放心回马鞍山吧,不出差,注意疫情防控就行。结果刚到高铁站就打电话来,说是一个很紧急的项目要去桂林出差,赶紧订周日或者周一的飞机票过去年龄越大,就越难有反...

    只要不失去你的崇高整个世界就会向你敞开
  • 端午小记

    端午小记很遗憾 三个月没到就分手了 为什么是她因为刚好是她合适的时间合适的地点相遇再加上一些多巴胺和荷尔蒙的催化下我也想试试,以为这就是不等人的缘分 为什么是我因为刚好是我出现在合适的时间合适的地点在她被不喜欢的人追求时一面挡箭牌出现...

    端午小记
  • 利用微信小程序扫码授权

    微信小程序扫码授权背景想要使用微信扫码登录自己的网址,通过授权快速获取用户的昵称,头像功能由于没有企业认证账号,故只能通过微信小程序实现, 体验地址https://api.nnnnzs.cn/screen-demo.html?env=...

    利用微信小程序扫码授权
  • Math.ceil(25/10)*10 === 30

    终于是到了四舍五入等于 30 的年龄了其实这应该是一篇放在 2022 年 3 月 8 日更新的博客内容应该是来南京工作一年的总结拖到五一假期,整理一下思绪打算发的结果五一又忙着帮别人搬家生日也得过且过,所以拖到了现在 感情发上一篇帖...

    Math.ceil(25/10)*10 === 30
  • 强制加载element-dialog

    强制加载element-dialog背景123<el-dialog> <MyComponent /></el-dialog> 自己封装的组件 MyComponent ,放在了el-dialog里...

    强制加载element-dialog
  • github action部署到vps

    在 ECS 上创建用户,并设置密码 adduser github-action asswd passwd github-action 免密登陆 生成密钥 1ssh-keygen -t rsa -C 'github-act...

    github action部署到vps
  • leancloud-基础存储操作

    对象安装使用1234npm install leancloud-storage --save# debug模式DEBUG=leancloud* node src/leancloud.js 初始化12345678const AV = ...

    leancloud-基础存储操作