七牛上传文件自定义文件名|如何实现指定文件格式上传文件到百度网盘或者七牛云储存

七牛上传文件自定义文件名|如何实现指定文件格式上传文件到百度网盘或者七牛云储存的第1张示图

1. js上传音频到七牛云,当文件名称相同时,会发生冲突,如何删除或直接覆盖掉已上传的同名文件

正常操作是自定义文件名,比如时间戳。就不会发生冲突了请采纳

2. 关于七牛云存储自定义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简化代码了…

3. 如何实现指定文件格式上传文件到百度网盘或者七牛云储存

五块

4. 如何用python 七牛上传文件

首先要安装一个qiniu的包,下面是示例代码

fromqiniuimportAuth,put_data,put_fileaccessKey="xxx"secretKey="xxx"defupload_data(data,bucket_name):#生成上传凭证q=Auth(accessKey,secretKey)key=str(int(time()*1000))token=q.upload_token(bucket_name,key)#上传文件retData,respInfo=put_data(token,key,data)return'xxx.clouddn.com/'+keywithopen('meelo.jpg','rb')asf:url=upload_data(f.read(),'xxxx')

会返回上传文件的url

5. 七牛使用JavaScript上传文件,没有设置Key,为什么没有重命名为hash

在js代码中也没有设置keyQiniu.uploader({runtimes: 'html5,flash,html4', //上传模式,依次退化browse_button: btn_id, //上传选择的点选按钮,**必需**uptoken : data.token,domain: data.domain, //bucket 域名,下载资源时用到,**必需**flash_swf_url: '../plugins/plupload/Moxie.swf', //引入flash,相对路径max_retries: 3, //上传失败最大重试次数dragdrop: false, //开启可拖曳上传chunk_size: '200kb', //分块上传时,每片的体积auto_start: true,multi_selection:false,filters : {max_file_size : '200kb',mime_types: [{title : "Image files", extensions : "jpg,png"}]},init: { 'FilesAdded': function(up, file) { // 每个文件上传前,处理相关的事情if(size>1){ if($(".img-area").length == size){$.each(up.files, function (i, file) {up.removeFile(file);});layer.alert('最多只允许上传'+size+'张图片!', {closeBtn: false});}}}, 'FileUploaded': function(up, file, info) {$.each(up.files, function (i, file) {up.removeFile(file);});}, 'Error': function(up, err, errTip) {}}});

6. 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>

7. 不知道怎么上传文件到七牛云上,大神们有步骤吗

七牛云上传文件的方法还挺多的,我说2种常用的方法,第一种:在七牛云找到控制台界面的对象存储–空间管理–文件管理,选择文件进行上传。第二种方法:选用服务端SDK进行上传,建议先参阅服务端SDK文档,可以在七牛云的SDK&工具栏目下找文档查看,当前七牛云仅提供文档中已有的相关SDK。

8. 七牛 如果文件名相同会不会覆盖

1、这么就用不会提示了:# \cp -rf 2、 原因:# vi ~/.bashrc 如果你看到如下内容,以下命令都会用别名执行了,就是说自动加了 -i 参数:alias rm='rm -i'alias cp='cp -i'alias mv='mv -i' 为了让复制和移动大量文件去覆盖目标时,不会产生一个个的提示,命令应该这样写# \cp -rf /data/xxx* /home/xxx 注意 cp 命令前加了 \ ,意思是不让它用~/.bashrc里的别名运行,即 -i 参数3、补充cp该命令的各选项含义如下- a 该选项通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录,其作用等于dpR选项的组合。- d 拷贝时保留链接。- f 删除已经存在的目标文件而不提示。- i 和f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝。- p 此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中。- r 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。- l 不作拷贝,只是链接文件。4、需要说明的是,为防止用户在不经意的情况下用cp命令破坏另一个文件,如用户指定的目标文件名是一个已存在的文件名,用cp命令拷贝文件后,这个文件就会被新拷贝的源文件覆盖,因此,建议用户在使用cp命令拷贝文件时,最好使用i选项。

9. 如何使用element-ui的upload组件实现上传文件到七牛

具体实现

在创建存储空间的时候,可以选择私人空间,但是图片的外链访问都需要秘钥,版公共空间权则不需要。

生成token后,就可以实现上传了。

10. 七牛云js上传 为什么没有后缀

上传文件的控件 就可以显示文件名的,不过显示的是带后缀的,你是想显示不带后缀的是吗那就用js 取到那个dom节点 然后把你去掉后缀的文件名 追加进去

未经允许不得转载:山九号 » 七牛上传文件自定义文件名|如何实现指定文件格式上传文件到百度网盘或者七牛云储存

赞 (0)