当前位置:首页 » 文件管理 » base64上传七牛

base64上传七牛

发布时间: 2022-09-10 13:37:45

‘壹’ thinkphp配置七牛 domain参数什么意思

'domain' => '<这里填七牛外链默认域名>',

第一步,注册七牛云,创建空间,将空间设为私有,需要记下的东西:
accessKey,secrectKey,domain,bucket

第二步配置ThinkPHP
在config.php添加
'UPLOAD_SITEIMG_QINIU' => array (
'maxSize' => 5 * 1024 * 1024,//文件大小
'rootPath' => './',
'saveName' => array ('uniqid', ''),
'driver' => 'Qiniu',
'driverConfig' => array (
'accessKey' => '<这里填七牛AK>',
'secrectKey' => '<这里填七牛SK>',
'domain' => '<这里填七牛外链默认域名>',
'bucket' => '<这里填七牛空间名称>',
)
)
复制代码
第三步,上传文件
控制器
$setting=C('UPLOAD_SITEIMG_QINIU');
$Upload = new \Think\Upload($setting);
$info = $Upload->upload($_FILES);
复制代码
上传文件后得到的$info是这样的
array(1) {
["photo"] => array(10) {
["name"] =>
["type"] =>
["size"] =>
["key"] =>
["ext"] =>
["sha1"] =>
["savename"] =>
["savepath"] =>
["url"] =>
}
}
复制代码
第四步,计算下载凭证
Common目录function.php添加方法
function Qiniu_Encode($str) // URLSafeBase64Encode
{
$find = array('+', '/');
$replace = array('-', '_');
return str_replace($find, $replace, base64_encode($str));
}
function Qiniu_Sign($url) {//$info里面的url
$setting = C ( 'UPLOAD_SITEIMG_QINIU' );
$etime = NOW_TIME + 86400;//下载凭证有效时间
$DownloadUrl = $url . '?e=' . $etime;
$Sign = hash_hmac ( 'sha1', $DownloadUrl, $setting ["driverConfig"] ["secrectKey"], true );
$EncodedSign = Qiniu_Encode ( $Sign );
$Token = $setting ["driverConfig"] ["accessKey"] . ':' . $EncodedSign;
$RealDownloadUrl = $DownloadUrl . '&token=' . $Token;
return $RealDownloadUrl;
}
复制代码
$RealDownloadUrl为下载对应私有资源的可用URL
注意
我在开发中没有遇到QiniuStorage.class.php文件$ak和$sk值不对的问题,估计是官方已经修改这个bug。
但是我上传文件是都是提示上传地址不对,最后检查发现七牛现在存储区域已经支持华东,华北,华南等多个区域,但是官方还是华东的上传地址,需要手动修改QiniuStorage.class.php文件的配置
public $QINIU_RSF_HOST = '';
public $QINIU_RS_HOST = 'h';
//public $QINIU_UP_HOST = '';//华东
//public $QINIU_UP_HOST = '';//华北
public $QINIU_UP_HOST = '';//华南
public $timeout = '';

‘贰’ 关于七牛云存储自定义URL的问题

近段时间将使用七牛云存储来存放用户上传的数据,客户端通过七牛的js-sdk与七牛交互,服务端C#实现了七牛相关的接口。在这过程中多多少少遇到点问题,在这里总结一下。原文: 使用七牛云存储的一些经验总结
599错误处理
如果在与七牛的交互中出现http状态码为599的错误,一句话,不要犹豫,直接联系七牛技术支持 。七牛的文档也在很多地方提到这个错误,都是指导大家去联系技术支持的。笔者是在分块上传后的 mkfile 调用时出现的,联系技术支持后,说是调整了一下,让我重试。后来就好了...
分块上传无法从回调中获得文件的原始名
简单上传采用的是multipart/form-data方式上传,七牛服务端能够从请求中获得文件的原始名,并支持使用魔法变量 $(fname) 回调业务服务器。不过当使用分片上传的时候情况有所不同。分片上传需要在最后调用 mkfile ,来将分片拼接起来。但是, mkfile 接口支持普通的请求,并没有附带文件名,所以七牛也就无法获得文件名,此时从 $(fname) 中是取不到文件名的。这个问题我也向七牛技术支持提交了问题,得到的结果是使用自定义变量 mkfile 支持将自定义变量放在url中,回调的时候自定义变量可以传递给业务服务器。
慎用图片预处理
七牛云支持很多对文件的预处理,其中最常用的应该就是图片预处理了,可以对图片的大小做变换等。七牛推荐使用GET的方式直接指定图片处理结果的url,像这样:
http://qiniuphotos.qiniudn.com/gogopher.jpg?imageView2/1/w/200/h/200

处理后的图片会自动缓存,用户不用关心,只要每次访问都用这个url就行了。然而,笔者在开始的时候,为了保持与其他文件形式统一的处理方法,对图片使用了预处理(因为视频什么的只能预处理),即在token中指定了预处理。此时问题出现了,从后台的日志看到,图片的预处理通知回调竟然比正常的上传成功回调还要快!这就导致预处理结果到来之前,我的业务服务器的数据库中还没有这个图片,无法保存预处理结果了。所以 推荐还是使用url直接处理,对图片要慎用预处理
视频文件无法快进播放
通常用户在观看视频的时候都会根据自己的喜好,快速将视频定位到指定的时间播放。实现这个功能,需要视频本身有关键帧信息、服务端需要支持关键帧播放请求,在 这篇文章 中有详细讨论。
但是笔者发现,在使用七牛云转化后的视频,这样做是无效的。于是咨询技术支持,得到的答案是:转化的文件是具有关键帧的,但七牛使用CDN加速,所以关键帧请求需要CDN的支持,如果想要用这个功能的话,需要单独联系销售或技术支持在CDN上配置,而且时间比较长。笔者联系了销售和技术支持,说是帮我配置,但到现在还没有搞定,因为最近这个也不是特别重要,所以也没有跟下去。
Callback校验
这是可选的一个步骤。由于七牛云会在上传完成之后回调业务服务器,所以理论上说业务服务器需要校验这个回调的合理性。原理在七牛的 文档 中有,需要用到 HMAC-SHA1 签名函数。但是七牛的sdk中没有提供直接的方式来做校验,在研读文档、多次失败和查看sdk源码后,笔者终于校验成功了。关键的分歧在于,文档中的这句话:

获取明文:data = Request.URL.Path +”\n” +Request.Body

这里的 Request.URL.Path 是否包含Querystring?答案是包含的!下面是笔者C#服务端的校验代码,使用的是ASP.NET Web Api:
```C#
byte[] key = System.Text.Encoding.UTF8.GetBytes(Qiniu.Conf.Config.SECRET_KEY);
using (HMACSHA1 hmac = new HMACSHA1(key))
{
var t = filterContext.Request.Content.ReadAsStringAsync();
t.Wait();
string rawbody = t.Result;
log.DebugFormat("request's rawbody : {0}", rawbody);
string text = filterContext.Request.RequestUri.PathAndQuery + "\n" + rawbody;
log.DebugFormat("PathAndQuery + \n + rawbody : {0}", text);
byte[] digest = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(text));
string computed = Qiniu.Util.Base64URLSafe.Encode(digest);
log.DebugFormat("Computed hash after base64 : {0}", computed);
IEnumerable<string> auths;
if (filterContext.Request.Headers.TryGetValues("Authorization", out auths) && auths.Count() == 1)
{
string auth = auths.First();
log.DebugFormat("Authorization in header : {0}", auth);
if (auth.StartsWith("QBox "))
{
var arr = auth.Substring(5).Split(':');
if (arr.Length == 2)
{
if (arr[1] != computed)
{
log.ErrorFormat("Authorization failed. Since auth from header {0} not equals computed {1}", arr[1], computed);
}
else
{
log.Debug("Authorization success.");
//only pass can be return
return;
}
}
else
{
log.Error("Callback Authorization's format is invalid, can not find two part after split by ':'.");
}
}
else
{
log.Error("Callback Authorization's format is invalid, missing leading 'QBox '.");
}
}
else
{
log.Error("The request from qiniu callback is missing 'Authorization'");
}

filterContext.Response = filterContext.Request.CreateResponse(System.Net.HttpStatusCode.Forbidden);

}

如下几个注意点:

- 明文应当是请求的path+querystring部分和rawbody
- 对于.NET而言,明文和key都需要用UTF-8编码变换成字节才能进行签名。而php中的hash_hmac函数完全不用这么复杂...
- 签名的结果再用base64的url安全的方式编码,再与请求的http头部的Authorization比较

建议官方在文档中加入一些相对底层一些的编程语言的实现,php太高端了...

## js-sdk实现略显粗糙 ##

在使用过程中,我发现[官方的js-sdk](https://github.com/qiniupd/qiniu-js-sdk/)有几个我觉得不好的地方:

**不能为每个文件获取UpToken**

试想,在文件上传过程中有获取UpToken是必须的,而且UpToken又需要包含预处理指令,不同的文件显然需要不同的UpToken,而在js-sdk的实现中,只在初始化这个上传组件对象的时候请求一次上传凭证,后面所有的上传都需要使用这个预先得到的UpToken:

```javascript
uploader.bind('Init', function(up, params) {
getUpToken();
});

于是我修改了这部分,在 BeforeUpload 事件中请求UpToken。建议官方考虑更改这个地方
只能实现分片上传,无法断点续传
js-sdk的实现在分片上传的实现上,是很简单的,不仅没有使用分片,而是分块(一块4m,调用mkblk),而且没有实现持久化ctx,或者类似的回调或接口。4m分块这个问题还可以不追究,没有实现持久化ctx就说不过去了,不持久化怎么实现断点续传撒?!就算不实现,也应该给出回调的入口,让调用者来实现持久化,而我实在无法找到这个'空子'可钻,只能直接在源码上改动了。
没有复用流行类库的东西
这个其实算不上问题,因为作为一个不依赖jquery的sdk,当然不能使用jquery现成的东西,比如ajax。不依赖jquery就算了,依赖plupload是几个意思嘛,还依赖全局对象...于是最后,我干脆自己将sdk改成了Backbone的类,将不要的东西统统去掉,使用jquery和underscore简化代码了...

‘叁’ android客户端怎样用七牛上传照片

相信很多开发者会把图片存放到七牛上,我的web站点也是吧图片存储到七牛上,对于以图片为主的站点,这样可以节省很大带宽。
将图片上传到七牛服务器的重点就是获得上传凭证uploadToken,直接把AccessKey和Secret放到客户端太不安全,容易被反编译。所以需要在服务器端根据AccessKey和Secret动态生成一个uploadToken,然后传回到客户端,客户端通过这个uploadToken将图片上传到七牛服务器。
第一、在服务器端生成uploadToken

//将图片上传到七牛 start
$bucket='七牛空间名称';
$expires = 3600;
$accessKey='去七牛查看';
$secretKey='去七牛查看';
$client = new QiniuClient($accessKey,$secretKey);
$flags = array();
$scope = $bucket;
$deadline = time() + $expires;
$flags['scope'] = $scope;
$flags['deadline'] = $deadline;
$flags['returnBody'] = null;
echo $client->uploadToken($flags);

这里注意一下bucket:七牛空间名称和deadline:uploadToken失效时间,具体可查看一下官网上传凭证介绍
uploadToken($flags)是自己封装的用于生成上传凭证的函数

public function uploadToken($flags) { if(!isset($flags['deadline'])) $flags['deadline'] = 3600 + time(); $encodedFlags = self::urlsafe_base64_encode(json_encode($flags)); $sign = hash_hmac('sha1', $encodedFlags, $this->secretKey, true); $encodedSign = self::urlsafe_base64_encode($sign); $token = $this->accessKey.':'.$encodedSign. ':' . $encodedFlags; return $token; }
public static function urlsafe_base64_encode($str){
$find = array("+","/");
$replace = array("-", "_");
return str_replace($find, $replace, base64_encode($str));
}

第二、下载qiniu-android-sdk-7.0.0.jar和android-async-http-1.4.6并导入项目
第三、android上传图片
由于Android4.0 以后不允许在主线程进行网络连接,所以需要新开个线程来获取上传凭证。

/*
* 上传图片到七牛
*/
private void uploadImg(){
new Thread(new Runnable(){
@Override
public void run() {
//获得七牛上传凭证uploadToken
String token=getUploadToken();
//手机SD卡图片存放路径
String imgPath="";
try {
imgPath=FileUtil.getBasePath()+ "/test.jpg";
} catch (IOException e) {
e.printStackTrace();
}
if(token!=null){
String data = imgPath;
//图片名称为当前日期+随机数生成
String key = getRandomFileName();
UploadManager uploadManager = new UploadManager();
uploadManager.put(data, key, token,
new UpCompletionHandler() {
@Override
public void complete(String arg0, ResponseInfo info, JSONObject response) {
// TODO Auto-generated method stub
Log.i("qiniu", info.toString());
}
}, null);
}
else{
Log.i("fail", "上传失败");
}
}
}).start();
}

FileUtil.getBasePath()使用来获取SD卡基本路径,getRandomFileName()生成一个随机数来命名上传图片,具体方法我在这就不写了。

获得上传凭证的方法也很简单,直接使用httpget和服务器通信,获得第一步中生成的数据即可。(注意10.0.2.2是模拟器提供的特殊IP,等同于在电脑端的环回测试IP127.0.0.1)

/*
* 获得七牛上传凭证uploadtoken
*/

private String getUploadToken()
{
HttpClient client = new DefaultHttpClient();
StringBuilder builder = new StringBuilder();

HttpGet myget = new HttpGet("http://10.0.0.2/test/getUploadToken.php");
try {
HttpResponse response = client.execute(myget);
BufferedReader reader = new BufferedReader(new InputStreamReader(
response.getEntity().getContent()));
for (String s = reader.readLine(); s != null; s = reader.readLine()) {
builder.append(s);
}
return builder.toString();
} catch (Exception e) {
Log.i("url response", "false");
e.printStackTrace();
return null;
}
}

通过LOG日志可以看到Qiniu--success,说明上传成功。

‘肆’ 谁用七牛云设置水印成功了

相信很多开发者会把图片存放到七牛上,我的web站点也是吧图片存储到七牛上,对于以图片为主的站点,这样可以节省很大带宽。将图片上传到七牛服务器的重点就是获得上传凭证uploadToken,直接把AccessKey和Secret放到客户端太不安全,容易被反编译。所以需要在服务器端根据AccessKey和Secret动态生成一个uploadToken,然后传回到客户端,客户端通过这个uploadToken将图片上传到七牛服务器。第一、在服务器端生成uploadToken//将图片上传到七牛start$bucket='七牛空间名称';$expires=3600;$accessKey='去七牛查看';$secretKey='去七牛查看';$client=newQiniuClient($accessKey,$secretKey);$flags=array();$scope=$bucket;$deadline=time()+$expires;$flags['scope']=$scope;$flags['deadline']=$deadline;$flags['returnBody']=null;echo$client->uploadToken($flags);这里注意一下bucket:七牛空间名称和deadline:uploadToken失效时间,具体可查看一下官网上传凭证介绍uploadToken($flags)是自己封装的用于生成上传凭证的函数publicfunctionuploadToken($flags){if(!isset($flags['deadline']))$flags['deadline']=3600+time();$encodedFlags=self::urlsafe_base64_encode(json_encode($flags));$sign=hash_hmac('sha1',$encodedFlags,$this->secretKey,true);$encodedSign=self::urlsafe_base64_encode($sign);$token=$this->accessKey.':'.$encodedSign.':'.$encodedFlags;return$token;}publicstaticfunctionurlsafe_base64_encode($str){$find=array("+","/");$replace=array("-","_");returnstr_replace($find,$replace,base64_encode($str));}第二、下载qiniu-android-sdk-7.0.0.jar和android-async-http-1.4.6并导入项目第三、android上传图片由于Android4.0以后不允许在主线程进行网络连接,所以需要新开个线程来获取上传凭证。/**上传图片到七牛*/privatevoiploadImg(){newThread(newRunnable(){@Overridepublicvoidrun(){//获得七牛上传凭证uploadTokenStringtoken=getUploadToken();//手机SD卡图片存放路径StringimgPath="";try{imgPath=FileUtil.getBasePath()+"/test.jpg";}catch(IOExceptione){e.printStackTrace();}if(token!=null){Stringdata=imgPath;//图片名称为当前日期+随机数生成Stringkey=getRandomFileName();UploadManageruploadManager=newUploadManager();uploadManager.put(data,key,token,newUpCompletionHandler(){@Overridepublicvoidcomplete(Stringarg0,ResponseInfoinfo,JSONObjectresponse){//TODOAuto-generatedmethodstubLog.i("qiniu",info.toString());}},null);}else{Log.i("fail","上传失败");}}}).start();}FileUtil.getBasePath()使用来获取SD卡基本路径,getRandomFileName()生成一个随机数来命名上传图片,具体方法我在这就不写了。获得上传凭证的方法也很简单,直接使用httpget和服务器通信,获得第一步中生成的数据即可。(注意10.0.2.2是模拟器提供的特殊IP,等同于在电脑端的环回测试IP127.0.0.1)/**获得七牛上传凭证uploadtoken*/privateStringgetUploadToken(){HttpClientclient=newDefaultHttpClient();StringBuilderbuilder=newStringBuilder();HttpGetmyget=newHttpGet("10.0.0.2/test/getUploadToken.php");try{HttpResponseresponse=client.execute(myget);BufferedReaderreader=newBufferedReader(newInputStreamReader(response.getEntity().getContent()));for(Strings=reader.readLine();s!=null;s=reader.readLine()){builder.append(s);}returnbuilder.toString();}catch(Exceptione){Log.i("urlresponse","false");e.printStackTrace();returnnull;}}通过LOG日志可以看到Qiniu--success,说明上传成功。

‘伍’ # 自己拥有一台服务器可以做哪些很酷的事情

买了云服务器后,打算来折腾一下服务器。服务器都有哪些用途?

建网站、博客。就是这篇文章所说的内容。为甚么要自己建立博客?因为博客在自己手上总是比较踏实。像社交网站兴衰交替,以前写的心得体会在旧的社交网站上都找不到了,而且自己博客限制也没那么大。
具体建站过程可以看我写的文章 阿里云服务器快速建网站_安装BT宝塔面板和wordpress

云服务器(Elastic Compute Service,简称ECS)根据其官网介绍是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。

ECS即类似于国外的VPS。(不要好奇那么多人买国外VPS干嘛用)。架设个人博客网站、企业门户都可以使用ECS。如果其网站如个人博客主要面向国内用户访问,为加快速度还是建议选用国内的服务器商。

[阿里云域名] ( https://wanwang.aliyun.com/domain/com/?userCode=yos4xyvp )连接,

[阿里云服务器ECS] ( https://www.aliyun.com/minisite/goods?userCode=yos4xyvp ) 链接

以下操作建议电脑端进行。

点击[阿里云官网链接] ( https://www.aliyun.com/?userCode=yos4xyvp ),点击免费注册链接。跳出页面选择账号密码注册,输入手机号,注册阿里云账号。注册之后,需要进行邮箱安全认证。

重新登录,管理台布局模式选择“个人开发者”,进入管理台界面。

在搜索栏搜索域名,进入“域名控制台”。点击下面 “域名注册”链接 。进入阿里云万网页面。

搜索栏直接搜索想要注册的域名,如 jiudangwoshicedan.com,选择“加入清单”。下面还有不同的套餐,看个人需要。点击右边清单结算按钮,跳出“确认订单”页面。

“确认订单”页面需要“创建信息模板”。

点击“创建信息模板”链接进入该页面,输入邮箱、手机、地址等。确认之后,还需邮箱验证。

验证完毕之后,重新刷新一下“确认订单”页面,选择域名持有者为“个人”。

“优惠口令”:通过关注阿里云域名微信公众号,在公众号中回复“优惠口令”获取。

全部勾选,点击提交。付款之后域名注册完成。

在此吐槽一下用手机阿里云app注册域名各种bug:

最开始是常使用手机app进行域名注册的。折腾了大半个小时没搞定。

为方便操作,不建议使用阿里云手机app作为新手注册,除非已经进行了邮箱认证和身份证实名认证。在手机app中顶部搜索栏搜索域名,第一个跳出域名注册链接。

注意,域名备案需准备服务器(有IP那种) ,所以得先购买云服务器ECS。点击[阿里云服务器ECS] ( https://www.aliyun.com/proct/ecs?spm=5176.13735996.muuje2t9u.1.53a13b5aPAV4Xh&aly_as=sqns2HDgL&userCode=yos4xyvp )链接,进入ECS页面,点击“立即购买”按钮,进入ECS购买页面。

在ECS购买页面,如果新手或者嫌麻烦可以选择“一键购买”标签。

最后点击“确认订单”进行购买。

跳出“确认订单”页面,勾选“服务协议”,点击“确认下单”。进行支付。

支付完成即OK,ECS购买完成。

域名备案需要有域名、服务器。其流程如下所示。

点击 网站备案 链接,点击页面右边“开始备案”按钮,跳出“开始备案”页面。

填入“主办单位所属区域”,“主办单位性质”选择“个人”,填入身份证号码和域名。点击最后“验证备案类型”。进入“产品验证”页面。

“产品类型”选择ECS,“选择实例”里会自动选择自己购买的云服务器“实例名称”。最后点击“验证”按钮。

后面就是提交身份证正反面、人脸识别。后面就等着阿里云客服初审,初审会电话联系进行提交资料的修改等帮助。修改完毕之后就提交备案审核机构。等待十来天不等就通过备案审查,会收到域名备案信息短信和邮件提醒。

点击 阿里云终端控制台链接 登录

点击实例ID里的链接

点击“远程连接”旁边“更多”下拉箭头的”重置实例密码“。

跳出”重置密码“页面,输入新的密码,这个是网页和远程SSH登录ECS的密码。

最终显示登录成功界面。

另外,如果觉得网页不习惯的话,也可以SSH远程登录。

图床,可以参考我此前写的文章 七牛图床添加阿里云域名 、 阿里云域名注册与备案、服务器ECS购买与登录 、 markdown多平台发布及七牛图床使用

因为使用Markdown作为日常文章记录,markdown挺方便的,就是对图片引用不太方便,一直使用本地图片引用。

当要将一些文章发布到知乎、个人博客、还有微信公众号的时候,图片就缺失了,需要手动重新上传。当图片比较多,发布平台也比较多时候,就觉得本地图片引用不合适。

针对这个问题,解决方法就是使用图床,在文章里引用是图床连接。

针对无网络情形下,则用本地图片替换,typora这个编辑器提供这个选项。

根据对网上的搜索和本人使用对比,推荐使用七牛作为图床,并配合Mpic图床神器使用方便粘贴图床连接。

1.通过网上搜索,有建议通过base64进行转换的,转换成一大坨base64文本插入,markdown编辑器都有些卡死了。这个base64方式就直接pass了。

2.还有推荐github作为图床的,一是这个由于众所周知的原因需要加速器,否则比较慢;二是上传之后,直接复制github里repository图片链接并不能直接显示,需要点击download,生成raw.githubusercontent.com/XX的连接,需要等一段时间,这段时间可长可短,反正我等了10分钟还没生成;三是没有图片上传神器,需要手动复制链接。这个也太麻烦了。如下图就是用github作为图床的,不知道大家刷出来了么?

七牛官方注册为 https://portal.qiniu.com/signup?code=1h51ixa3vs4lu ,通过个人认证后提供10G存储空间,足够博客等使用了。

这个注册过程过程如下

1.填入邮箱和手机号,注册后需要验证邮箱,同时通过个人认证

图床神器是配合桌面使用,方便将图片上传至七牛云空间,并且自动生成链接插入markdown文件中。

填入的域名在这里找到

推荐使用微信公众号格式化工具,网址是 http://blog.didispace.com/tools/online-markdown/

通过在网页左边粘贴markdown语言,右边即可生成公众号适用的素材,通过复制按钮即可粘贴至公众号发布页。

通过粘贴markdown直接生成

推荐选用Typora作为markdown编辑器。

作者的其他回答:

阿里云域名注册与备案、服务器ECS购买与登录 、

七牛图床添加阿里云域名 、

‘陆’ 七牛图片基本处理和水印能同时用吗

相信很多开发者会把图片存放到七牛上,我的web站点也是吧图片存储到七牛上,对于以图片为主的站点,这样可以节省很大带宽。 将图片上传到七牛服务器的重点就是获得上传凭证uploadToken,直接把AccessKey和Secret放到客户端太不安全,容易被反编译。所以需要在服务器端根据AccessKey和Secret动态生成一个uploadToken,然后传回到客户端,客户端通过这个uploadToken将图片上传到七牛服务器。 第一、在服务器端生成uploadToken //将图片上传到七牛 start $bucket='七牛空间名称'; $expires = 3600; $accessKey='去七牛查看'; $secretKey='去七牛查看'; $client = new QiniuClient($accessKey,$secretKey); $flags = array(); $scope = $bucket; $deadline = time() + $expires; $flags['scope'] = $scope; $flags['deadline'] = $deadline; $flags['returnBody'] = null; echo $client->uploadToken($flags); 这里注意一下bucket:七牛空间名称和deadline:uploadToken失效时间,具体可查看一下官网上传凭证介绍 uploadToken($flags)是自己封装的用于生成上传凭证的函数 public function uploadToken($flags) { if(!isset($flags['deadline'])) $flags['deadline'] = 3600 + time(); $encodedFlags = self::urlsafe_base64_encode(json_encode($flags)); $sign = hash_hmac('sha1', $encodedFlags, $this->secretKey, true); $encodedSign = self::urlsafe_base64_encode($sign); $token = $this->accessKey.':'.$encodedSign. ':' . $encodedFlags; return $token; } public static function urlsafe_base64_encode($str){ $find = array("+","/"); $replace = array("-", "_"); return str_replace($find, $replace, base64_encode($str)); } 第二、下载qiniu-android-sdk-7.0.0.jar和android-async-http-1.4.6并导入项目 第三、android上传图片 由于Android4.0 以后不允许在主线程进行网络连接,所以需要新开个线程来获取上传凭证。 /* * 上传图片到七牛 */ private void uploadImg(){ new Thread(new Runnable(){ @Override public void run() { //获得七牛上传凭证uploadToken String token=getUploadToken(); //手机SD卡图片存放路径 String imgPath=""; try { imgPath=FileUtil.getBasePath()+ "/test.jpg"; } catch (IOException e) { e.printStackTrace(); } if(token!=null){ String data = imgPath; //图片名称为当前日期+随机数生成 String key = getRandomFileName(); UploadManager uploadManager = new UploadManager(); uploadManager.put(data, key, token, new UpCompletionHandler() { @Override public void complete(String arg0, ResponseInfo info, JSONObject response) { // TODO Auto-generated method stub Log.i("qiniu", info.toString()); } }, null); } else{ Log.i("fail", "上传失败"); } } }).start(); } FileUtil.getBasePath()使用来获取SD卡基本路径,getRandomFileName()生成一个随机数来命名上传图片,具体方法我在这就不写了。 获得上传凭证的方法也很简单,直接使用httpget和服务器通信,获得第一步中生成的数据即可。(注意10.0.2.2是模拟器提供的特殊IP,等同于在电脑端的环回测试IP127.0.0.1) /* * 获得七牛上传凭证uploadtoken */ private String getUploadToken() { HttpClient client = new DefaultHttpClient(); StringBuilder builder = new StringBuilder(); HttpGet myget = new HttpGet("10.0.0.2/test/getUploadToken.php"); try { HttpResponse response = client.execute(myget); BufferedReader reader = new BufferedReader(new InputStreamReader( response.getEntity().getContent())); for (String s = reader.readLine(); s != null; s = reader.readLine()) { builder.append(s); } return builder.toString(); } catch (Exception e) { Log.i("url response", "false"); e.printStackTrace(); return null; } } 通过LOG日志可以看到Qiniu--success,说明上传成功。

‘柒’ 如何基于七牛云存储+Markdown编辑器做静态博客

首先,在七牛上创建一个 bucket,我们假设名字叫 qiniu。上传一个样式单文件 stylesheet.css。假设关联的域名叫 open.qiniudn.com,那么这个样式单可以通过 http://open.qiniudn.com/stylesheet.css 访问到。
其次,为 qiniu 这个空间设置样式分隔符为 '.'。这可以通过 qboxrsctl separator qiniu '.' 来完成。
最后,为 qiniu 这个空间设置一个名为 html 的数据处理样式。命令为:
qboxrsctl style qiniu html '$0.md?md2html/0/css/='

其中,= 是对 http://open.qiniudn.com/stylesheet.css 进行 UrlsafeBase64Encode 后的结果。
如此,你上传任何一个 markdown 文件(比如 http://open.qiniudn.com/key-value-storage.md ),都可以通过对应的 html 后缀文件访问(比如 http://open.qiniudn.com/key-value-storage.html )。
如果你不希望让别人可以看到 markdown 文件的原始内容,可以将 bucket 设置为保护:
qboxrsctl protected qiniu 1

‘捌’ php表单上传图片到七牛云存储并返回地址……求具体流程~有代码更好

有的,我最近研究了一下,写了一篇记录,如下

原文地址:http://cuiqingcai.com/?p=157

网上关于七牛云存储的教程除了官网上的API文档,其他的资料太少了。研究了下API之后,现在已经能实现图片的上传和下载及上传之后的重定向。

首先本篇文章实现的功能如下:

1.利用表单上传功能,用户可以点击选择文件按钮,选择本地的一个文件,同时设定上传的图片的名称,点击上传按钮可以上传并存储到七牛云存储。

2.在点击上传时会检测文件的后缀名,限制为jpg和png格式存储。

3.上传成功后跳转到自己设定的一个URL,并传回文件信息,如文件名。而不是显示七牛白花花的json显示页面。

好啦,那我们开始吧,首先我们要有一个七牛云存储账号,如果没有的就自己去申请吧。

七牛云存储传送门:http://www.qiniu.com/

一.SDK下载

https://github.com/qiniu/php-sdk/tags

戳这个网址下载一下SDK吧,里面封装了文件上传下载等等的方法,我们引入之后可以直接调用。

SDK之中有一个qiniu的文件夹,这是所有的SDK实货,这个是最重要的。我们首先要把这个文件夹及里面的文件放到项目文件夹中,比如我放到这里。

大家可以看到有一个qiniu文件夹。好啦,资源支持就是这样。接下来我们要实现代码咯。

二.文件的上传。

1.首先把你七牛云存储的密钥照出来,点击账号设置可以看到有一个AccessKey和SecretKey,留着备用。

2.上传凭证生成。

在这里我们首先要引入rs.php文件,自己找一对应路径,代码如下:

require_once(dirname(__FILE__)."/../../qiniu/rs.php");

dirname()是指的绝对路径,有时相对路径会出现问题,建议在前面加上dirname方法获取绝对路径。

require_once是引入文件,表示该文件只引入一次。

然后,传入你的AccessKey和SecretKey

代码如下:

$accessKey='';//换成你自己的密钥
$secretKey='';//换成你自己的密钥


Qiniu_SetKeys($accessKey, $secretKey);

然后建一个上传策略对象,将你的bucket传入,bucket 就是你的空间名。

$bucket = 'designpartners';
$putPolicy = new Qiniu_RS_PutPolicy($bucket);

然后调用此方法来生成上传凭证。

$upToken = $putPolicy->Token(null);

接下来就写一个html表单

<formmethod="post"action="http://up.qiniu.com"name="form"enctype="multipart/form-data">
<ul>
<inputtype="hidden"id="token"name="token"value=<?phpecho$upToken?>>
<li>
<labelfor="key">key:</label>
<inputname="key"value="">
</li>
<li>
<labelfor="bucket">照片:</label>
<inputname="file"type="file"/>
</li>
<li>
<inputtype="submit"value="提交">
</li>
</ul>
</form>

action就填写up.qiniu.com,表单提供了一个输入框key,用来输入你想保存的图片名称,上传到七牛之后就是这个名字。

然后一个文件选择,一个提交按钮。运行结果如下:

输入key值和选择照片即可实现照片的上传。哈哈哈有没有很简单。

三、文件下载

原理和文件上传功能相仿。

引入文件

require_once(dirname(__FILE__)."/../../qiniu/rs.php");

声明你的七牛云存储域名和两个密钥以及向下载的文件名称

$key='00000';
$domain='designpartners.qiniudn.com';
$accessKey='';
$secretKey='';

注意:1.key值即为文件名,不要加后缀

2.domain即为bucket加上qiniudn.com,例子中的designpartners就是我在上传图片时用的bucket名。

3.accessKey和secretKey换成你自己的,直接用我的不行的..因为我修改了.

Qiniu_SetKeys($accessKey,$secretKey);
$baseUrl=Qiniu_RS_MakeBaseUrl($domain,$key);
$getPolicy=newQiniu_RS_GetPolicy();
$privateUrl=$getPolicy->MakeRequest($baseUrl,null);
echo$privateUrl." ";

传入这四个值即可生成一样url,直接访问url即可实现图片的下载。

在引入图片时直接

<img src = "<?php echo $privateUrl; ?>"/>

即可引入图片咯,很简单的吧。

四、303重定向

在上面的方法中,我们上传图片成功后跳转到up.qiniu.com下,会显示白白的网页,显示一个json字符串,但是在实际网站开发中我们肯定 不能让用户看到这种网页,所以我们用到了303跳转。SDK中也为我们封装了这个方法。使用其实非常简单。在上传文件的代码中添加两行代码即可

$putPolicy=newQiniu_RS_PutPolicy($bucket);
$putPolicy->ReturnUrl=site_url()."/upload/receiveInfo";
$putPolicy->ReturnBody='{"key":$(key)}';

注意:1.ReturnUrl和ReturnBody必须指定,并且首字母要大写,很多人都小写开头,这样会跳转不成功。

2.ReturnUrl必须是一个公网可以访问的网址,在本地测试是不可能通过的。比如你写成localhost,七牛服务器是定位不到的。
3.这个ReturnUrl的链接后会跟着一个?upload_ret=XXX,可以用get方法获取这个upload_ret。upload_ret的内容是base64安全编码的json形式的key值。

值的解析:比如我上传的文件名是555

upload/receiveInfo?upload_ret=eyJrZXkiOiAiNTU1In0=

网址后缀如上所示,把那个upload_ret复制下来,用base64解码可以出现如下结果:

{"key": "555"}

所以,我们要获取555这个值的代码如下,即解析代码如下:

$upload_ret=$_GET['upload_ret'];
$json_ret=base64_decode($upload_ret);
$result=json_decode($json_ret);
echo"key".$result->key;

好啦,获取到这个key值之后,你可以选择存到数据库或者进行其他的操作咯。

五、上传前文件类型的验证

我们可以用js来验证文件的后缀名,

在form的属性里加上

onsubmit="return isValidateFile('file');"

加上一个js方法

<script>
functionisValidateFile(obj){
varextend=document.form.file.value.substring(document.form.file.value.lastIndexOf(".")+1);
if(extend==""){
alert("请选择头像");
returnfalse;
}
else{
if(!(extend=="jpg"||extend=="png")){
alert("请上传后缀名为jpg或png的文件!");
returnfalse;
}
}
returntrue;
}
</script>

即可验证它的类型是否合法。

附:CI代码实现:

获取Uptoken:

functiongetUptoken(){
require_once(dirname(__FILE__)."/../../qiniu/rs.php");
//远程存储空间名称
$bucket='designpartners';
$accessKey='';
$secretKey='';
Qiniu_SetKeys($accessKey,$secretKey);
$putPolicy=newQiniu_RS_PutPolicy($bucket);
echosite_url();
$putPolicy->ReturnUrl=site_url()."/upload/receiveInfo";
$putPolicy->ReturnBody='{"key":$(key)}';
$upToken=$putPolicy->Token(null);
return$upToken;
}

文件上传:

publicfunctionuploadPic(){
$upToken=$this->getUptoken();
$data['upToken']=$upToken;
$this->load->view('upload',$data);
}

303重定向解析:

publicfunctionreceiveInfo(){
$upload_ret=$_GET['upload_ret'];
$json_ret=base64_decode($upload_ret);
$result=json_decode($json_ret);
echo"key".$result->key;
}

文件下载:

publicfunctiondownloadPic(){
require_once(dirname(__FILE__)."/../../qiniu/rs.php");
$key='00000';
$domain='designpartners.qiniudn.com';
$accessKey='';
$secretKey='';
Qiniu_SetKeys($accessKey,$secretKey);
$baseUrl=Qiniu_RS_MakeBaseUrl($domain,$key);
$getPolicy=newQiniu_RS_GetPolicy();
$privateUrl=$getPolicy->MakeRequest($baseUrl,null);
echo"====>getPolicyresult: ";
echo$privateUrl." ";
}

表单:

<script>
functionisValidateFile(obj){
varextend=document.form.file.value.substring(document.form.file.value.lastIndexOf(".")+1);
if(extend==""){
alert("请选择头像");
returnfalse;
}
else{
if(!(extend=="jpg"||extend=="png")){
alert("请上传后缀名为jpg或png的文件!");
returnfalse;
}
}
returntrue;
}
</script>
<formmethod="post"action="http://up.qiniu.com"name="form"enctype="multipart/form-data"onsubmit="returnisValidateFile('file');">
<ul>
<inputtype="hidden"id="token"name="token"value=<?phpecho$upToken?>>
<li>
<labelfor="key">key:</label>
<inputname="key"value="">
</li>
<li>
<labelfor="bucket">照片:</label>
<inputname="file"type="file"/>
</li>
<li>
<inputtype="submit"value="提交">
</li>
</ul>
</form>

‘玖’ 如何部署 Octopress 到七牛云存储

首先,在七牛上创建一个 bucket,我们假设名字叫 qiniu。上传一个样式单文件 stylesheet.css。假设关联的域名叫 open.qiniudn.com,那么这个样式单可以通过 http://open.qiniudn.com/stylesheet.css 访问到。
其次,为 qiniu 这个空间设置样式分隔符为 '.'。这可以通过 qboxrsctl separator qiniu '.' 来完成。
最后,为 qiniu 这个空间设置一个名为 html 的数据处理样式。命令为:
qboxrsctl style qiniu html '$0.md?md2html/0/css/='

其中,= 是对 http://open.qiniudn.com/stylesheet.css 进行 UrlsafeBase64Encode 后的结果。
如此,你上传任何一个 markdown 文件(比如 http://open.qiniudn.com/key-value-storage.md ),都可以通过对应的 html 后缀文件访问(比如 http://open.qiniudn.com/key-value-storage.html )。

‘拾’ app base64上传好不好

首先提问并没说清楚具体采用啥Lib,或者啥协议,上传。其次,后端是用啥开发也不清楚。
我现在做一下常见的场景假设。
1、这个App是基于Http协议实现的上传功能,具体用啥库到不用纠结
2、后端采用Php,JSP,NodeJS等常见的后端开发语言

先说结论:反对使用BASE64编码文件后在上传
原因如下:
1、使用BASE64编码后,会导致数据量增加33%,对于手机App来讲,这是不可容忍的。
2、额外的编码工作带来的CPU开销,电量开销。(虽然开销很小,蚊子肉也是肉啊亲)
3、现有后端框架,基本上都能轻松处理上传任务。

热点内容
ig加密语音 发布:2024-10-11 12:19:25 浏览:485
钉图上传 发布:2024-10-11 12:11:27 浏览:477
脚本个 发布:2024-10-11 12:10:43 浏览:149
刚性攻丝的编程 发布:2024-10-11 12:10:39 浏览:467
怎么登录安卓版全民tv 发布:2024-10-11 12:10:33 浏览:622
服务器接收的参数名是什么 发布:2024-10-11 12:05:38 浏览:640
c语言中的goto 发布:2024-10-11 11:57:14 浏览:394
小司马编程 发布:2024-10-11 11:45:03 浏览:83
未使用标签进行编译 发布:2024-10-11 11:45:00 浏览:835
java开发源码下载 发布:2024-10-11 11:39:22 浏览:749