V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Recommended Services
Amazon Web Services
LeanCloud
New Relic
ClearDB
yibin001
V2EX  ›  云计算

百度云存储能不能够直接接收浏览器端要上传的文件?

  •  
  •   yibin001 · 2012-09-24 12:35:20 +08:00 · 4214 次点击
    这是一个创建于 4203 天前的主题,其中的信息可能已经有所发展或是发生改变。
    sdk里只能上传一个本地文件,如果我要在我的应用里集成就意味着用户在上传附件时,要先传到我自己的服务器,再调用sdk传到百度,这有点多余啊,我想用户能直接上传到百度云存储。

    目前想到用flash,但由于跨域,这个不能实现。
    如果直接用form提交倒是可以,但不大友好,而且有点麻烦。
    如果在bae里创建一个托管应用,flash往这个应用Post,再用这个应用往百度云提交倒是可以,但超过10M的话,bae就出报错。。。

    有没有好的办法?
    20 条回复    1970-01-01 08:00:00 +08:00
    chaojie
        1
    chaojie  
       2012-09-24 12:51:02 +08:00
    “直接用form提交倒是可以”,难道这不是直接接收浏览器端要上传的文件?
    yibin001
        2
    yibin001  
    OP
       2012-09-24 12:55:39 +08:00
    @chaojie
    这固然可以,
    但我需要放到一个论坛里,以上传附件的这种方式提供出来。
    难道用js提交?然后获取响应头??
    yaakua
        3
    yaakua  
       2012-09-24 13:07:06 +08:00
    异步提交,表面上看上去是异步提交,实际是使用iframe,iframe里面再使用form表单提交。
    这样用户看上去不用刷新整个页面就可以提交文件了。
    yibin001
        4
    yibin001  
    OP
       2012-09-24 13:13:23 +08:00   ❤️ 1
    @yaakua
    这倒是个办法,那怎么知道这个iframe是否post完成?
    chaojie
        5
    chaojie  
       2012-09-24 13:18:30 +08:00
    以前在sae中试过一种方法没有成功,没在bae中试过
    就是把swf文件与crossdomain.xml文件都上传到云存储中,这样就是在同一个域下了,sae的storage用的是三级域名
    yaakua
        6
    yaakua  
       2012-09-24 13:18:43 +08:00
    @yibin001
    iframe里面的表单提交后,可以跳转到一个新的页面,这个页面可以调用父页面的js方法,这样就可以主动通知父页面当前iframe里面的表单提交完成了。
    我以前做图片异步上传就这个原理,将返回的图片地址实时在父页面上显示出来,就可以实现用户预览上的图片了。
    chaojie
        7
    chaojie  
       2012-09-24 13:19:00 +08:00
    @yibin001 post完成后生成js parent.xxx()
    chaojie
        8
    chaojie  
       2012-09-24 13:22:52 +08:00
    百度云的文档很有问题。至今没找到怎么发html格式的邮件,难不成只有文本格式,那这个云消息服务发邮件就无用了吧。
    yibin001
        9
    yibin001  
    OP
       2012-09-24 13:24:17 +08:00
    @chaojie
    这种方法我用过,我是用swfupload上传,也就是把bae做成一个跳板,然后利用这个跳板做最后的上传,但bae有限制,curl的postdata不能超过10M。。。。。。超过10M就报413错了。
    yibin001
        10
    yibin001  
    OP
       2012-09-24 13:24:58 +08:00
    @yaakua

    这个实现不了,因为要提交的页面是地址是百度云的接口地址,这个地址是无法调用js的。。
    yibin001
        11
    yibin001  
    OP
       2012-09-24 13:26:15 +08:00
    @chaojie
    是的,那文档太鸡肋了。。。
    chaojie
        12
    chaojie  
       2012-09-24 13:29:24 +08:00
    @yibin001 不把swf放在bae上,而是放在云存储的一个bucket上呢?
    yaakua
        13
    yaakua  
       2012-09-24 13:34:58 +08:00
    @yibin001
    难道提交完成后没有后续动作了?至少会返回点什么吧。
    yibin001
        14
    yibin001  
    OP
       2012-09-24 14:01:51 +08:00
    @chaojie 不把swf放在bae上,而是放在云存储的一个bucket上呢?
    擦,还真行,bcs会不会觉得这是个漏洞?然后给封了。
    chaojie
        15
    chaojie  
       2012-09-24 14:36:06 +08:00
    @yaakua 返回什么是固定的,若要控制返回的东西必须用自己的服务器做中转。

    @yibin001 觉得不是漏洞,反而是理当提供的功能。已经用签名在控制权限,这儿就不该针对flash有障碍。sae也该放开才是
    yibin001
        16
    yibin001  
    OP
       2012-09-24 14:41:35 +08:00
    @chaojie
    现在用swfupload上传超过300M的文件了,但同时也有另外的问题产生,用swfupload上传的文件,在bcs中的content-type都是application/octet-stream,这样一来,上传的图片也无法用浏览器查看,就会提示下载了~~不知道swfupload在上传前能否获到contentype。

    @yaakua
    bcs接口的返回值中,如果上传OK的话,只会返回header,body不会有任何值。
    chaojie
        17
    chaojie  
       2012-09-24 15:18:57 +08:00
    我记得content-type是在生成url时可以指定的。
    生成下载url时指定content-type试试
    chaojie
        18
    chaojie  
       2012-09-24 15:55:03 +08:00
    @yibin001
    其实就是直接在url后面加上&response-content-type=application/pdf这种。我试了,可以

    curl -I http://bcs.duapp.com/desein/%2Fa.txt
    返回content-type:text/plain

    curl -I http://bcs.duapp.com/desein/%2Fa.txt?response-content-type=application/pdf
    返回content-type:application/pdf

    如果用chrome,直接显示“无法显示pdf”

    文档在
    http://developer.baidu.com/wiki/index.php?title=%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3/%E4%BA%91%E5%AD%98%E5%82%A8/Get_Object#request_header
    chaojie
        19
    chaojie  
       2012-09-24 15:56:34 +08:00
    既然有response-content-disposition,那下载的文件名也是可以定制的
    yibin001
        20
    yibin001  
    OP
       2012-09-24 16:17:00 +08:00
    @chaojie
    这个我知道,是在上传时指定的content-type,但swfupload是获取不到content-type的,所以在上传到bcs中就是未传递该值,so,所有文件都会是application/octet-stream。
    现在只能折中一下,获取file的type属性,该值只是swfupload获取要上传的文件的后缀名,根据后缀名动态拼content-type了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3246 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 13:55 · PVG 21:55 · LAX 06:55 · JFK 09:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.