WordPress教程

WordPress通过Rest API自定义附件上传接口

阿里云

有没有想过用 WordPress 来建立自己的文件存储空间,当作自己的网盘使用?这个业务实现的主要逻辑其实就是自己写一个 Rest API 接口上传文件到 WP 的媒体库中。

首先我们需要安装一个插件,这个插件很小,只是给网站后台登录提供 Basic 认证,并不是用来拓展业务接口的。开通了 Basic 认证方式,我们才有途径获得使用 Rest API 更新网站内容的权限,否则 Rest API 只提供读取权限。插件名称叫做 JSON Basic Authentication,官方下载地址:https://github.com/WP-API/Basic-Auth

也想出现在这里?联系我们
创客主机

要做接口,就先创建 endpoint。这次我创建两个,一个是用来转存网上的文件的,一个是用来自己上传文件的

  1. add_action( 'rest_api_init', function () {
  2. 	//转存
  3. 	register_rest_route( 'brain1981/v1', '/catch/', array(
  4. 		'methods' => 'POST',
  5. 		'callback' => 'brain1981_api_post_catch',
  6. 	) );
  7. 	//上传
  8. 	register_rest_route( 'brain1981/v1', '/stream/', array(
  9. 		'methods' => 'POST',
  10. 		'callback' => 'brain1981_api_post_stream',
  11. 	) );
  12. });

转存文件

  1. function brain1981_api_post_catch($request){
  2. 	$file_url = $request['url'];
  3. 	//如有需要,可以给所有通过这个接口存储的文件名加一个前缀
  4. 	$file_prefix = 'prefix_';
  5. 	$file_content=file_get_contents($file_url);
  6. 	$url_api = site_url("/wp-json/wp/v2/media/");
  7. 	$file_name = $request['filename'];
  8. 	$ch = curl_init();
  9. 	curl_setopt($ch, CURLOPT_URL,            $url_api );
  10. 	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
  11. 	curl_setopt($ch, CURLOPT_POST,           1 );
  12. 	curl_setopt($ch, CURLOPT_POSTFIELDS,     $file_content); 
  13. 	curl_setopt($ch, CURLOPT_HTTPHEADER,     array(
  14. 		'content-disposition: attachment; filename='.$file_prefix.$file_name.'"',
  15. 		'authorization: ' . $_SERVER['HTTP_AUTHORIZATION']
  16. 		)
  17. 	); 
  18. 	$result=curl_exec($ch);
  19. 	if(json_decode($result)->id){
  20. 		return json_decode($result)->guid->rendered ;
  21. 	}else{
  22. 		return json_decode($result)->data->status . " " .json_decode($result)->message;
  23. 	}
  24.  
  25. }

上传文件

  1. function brain1981_api_post_stream($request){
  2. 	$file_content = $request['content'];
  3. 	$file_content = base64_decode($file_content);
  4. 	$file_name = $request['filename'];
  5.  
  6. 	//如有需要,可以给所有通过这个接口存储的文件名加一个前缀
  7. 	$file_prefix = 'prefix_';
  8.  
  9. 	$url_api = site_url("/wp-json/wp/v2/media/");
  10.  
  11. 	if(!empty($request['mime'])){
  12. 		$mime = $request['mime'];
  13. 	}else{
  14. 		$mime="text/plain";
  15. 	}
  16.  
  17.  
  18. 	$file_name = $request['filename'];
  19. 	$ch = curl_init();
  20. 	curl_setopt($ch, CURLOPT_URL,            $url_api );
  21. 	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
  22. 	curl_setopt($ch, CURLOPT_POST,           1 );
  23. 	curl_setopt($ch, CURLOPT_POSTFIELDS,     $file_content); 
  24. 	curl_setopt($ch, CURLOPT_HTTPHEADER,     array(
  25. 		'content-disposition: attachment; filename='.$file_prefix.$file_name,
  26. 		'cache-control: no-cache',
  27. 		'authorization: ' . $_SERVER['HTTP_AUTHORIZATION'],
  28. 		'content-type: ' . $mime
  29. 		)
  30. 	); 
  31. 	$result=curl_exec($ch);
  32. 	if(json_decode($result)->id){
  33. 		return json_decode($result)->guid->rendered ;
  34. 	}else{
  35. 		return json_decode($result)->data->status . " " .json_decode($result)->message." ";
  36. 	}
  37. }

这样接口就建立完毕了,下面是如何请求这两个接口。

转存文件,接口 URL: http(s)://网站域名/wp-json/v1/catch/

请求格式为 JSON:

  1. {
  2.     "url": "附件的url地址,需包含http://或https://",
  3.     "filename": "文件名"
  4. }

直接上传文件,接口 URL: http(s)://网站域名/wp-json/v1/stream/

请求格式:

  1. {
  2.     "content": "数据流内容..数据流内容",
  3.     "filename": "文件名",
  4.     "mime": "文件格式"
  5. }

请求格式的注意点:
– 请注意 JSON 最后一行不能有逗号
– 视服务器条件而定,服务器会有一定的响应时间限制,原则上应该无法接受超过 50M 的数据(LNMP 默认环境),过大的数据流会造成超时和发送失败
– filename 文件名请包含合法的扩展名,暂只支持 jpg,gif、png、pdf 等常见格式
– mime 文件格式:填写对应文件的格式,如“image/jpeg”、“image/png”、“image/gif”、“application/pdf”、“application/pdf”或“text/plain”
– content 数据流的内容,可以直接把文件通过二进制数据写到这个 JSON 中

接下来我们需要通过 Basic 认证获取 API 的权限,再使用上面写出来的接口上传文件。
获取权限,就要在请求的头部把登录信息转换成 Base64 字符串,具体格式是这样的:

  1. Authorization: Basic {base64_encode([username]:[password])}
  2. Content-Type: application/json

提供一个 JS 的范例,用来转存文件:

  1. $.ajax({
  2.     url: 'http(s)://网站域名/wp-json/brain1981/v1/catch/',
  3.     method: 'POST',
  4.     crossDomain: true,
  5.     data: {
  6.         "url": "http://xxx.xxx/abc.jpg",
  7.         "filename": "xyz.jpg"
  8.     },
  9.     beforeSend: function ( xhr ) {
  10.          //以下这行要改成自己真实的用WP户名和密码,并且账号需具有editor或以上权限
  11.         xhr.setRequestHeader( 'Authorization', 'Basic ' + Base64.encode( 'username:password' ) );
  12.     },
  13.     success: function( data, txtStatus, xhr ) {
  14.         console.log( data );
  15.         console.log( xhr.status );
  16.     }
  17. });
  18. //认证字符串的Base64编码库
  19. var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/\r\n/g,"\n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}};

WordPress 通过 Rest API 自定义附件上传接口

已有 363 人购买
查看演示升级 VIP立刻购买

收藏
(0)

发表回复

热销模板

Ashade - 作品展示摄影相册WordPress汉化主题
LensNews

本站承接 WordPress / PbootCMS / DedeCMS 等
系统建站、仿站、开发、定制等业务!