javascript - 关于七牛云base64上传的JS跨域请求问题
怪我咯
怪我咯 2017-04-11 12:09:03
0
2
410

业余性质萌新,在做一个小博客的头像上传功能遇到困难。大概逻辑如此:先用FileReader上传文件获取了其路径给一个JS的头像组件,让用户剪裁完毕后转化成base64字符串,然后通过七牛云的javascript - base64接口直传到七牛云的空间。最后利用外链显示出来,回调等等信息。

上传涉及到上传权限,所以我用python的qiniu库在服务器生成token

@auth.route('/qiniu_token/', methods=['POST', 'GET'])
@login_required
def qiniu_token():
    q = qiniu.Auth(current_app.config['QINIU_ACCESS_KEY'], current_app.config['QINIU_SECRET_KEY'])
    bucket_name = 'picture'
    key = str(current_user.id)+'_avatar.png'    #这是在定义文件名
    token = q.upload_token(bucket_name, key, 3600)    #定义上传权限
    response = make_response(json.dumps({"uptoken": token,"key":key}))
    # 出错而添加了头部信息,后面会说,依然出错
    response.headers['Access-Control-Allow-Origin'] = 'http://127.0.0.1:5000'
    return response
    

报文响应200,成功打开。
然后,我在前端的js里写ajax获取这个token:

var upload_token;
$.ajax({
    url: $SCRIPT_ROOT +'/qiniu_token/',
    type:'GET',
    dataType: 'JSON',
    success: function(result){
      upload_token = result["uptoken"];
    }
})
        

经尝试,我在success里头加了alert或console.log能成功显示出token。

最后通过七牛云给出的方法上传到空间:

function putb64(pic, url, token){
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange=function(){
    if (xhr.readyState==4){
      document.getElementById("resp-text").innerHTML=xhr.responseText;
    }
  }
  xhr.open("POST", url, true);
  xhr.setRequestHeader("Content-Type", "application/octet-stream");
  xhr.setRequestHeader("Authorization", token);
  xhr.send(pic);
}

然而浏览器总是提示:

经查询,这是跨域问题。解决方案找到2种,一是改JSONP格式。但JSONP不支持POST,虽然我已经在视图函数view里加上登录验证但我觉得用GET来获取token是否不好。也看到建议用nginx反向代理,但我尚未部署,特意用nginx再写配置文件是下策。第二种方法就是在view里面加入头部请求的允许。比如response.headers['Access-Control-Allow-Origin'],但这个貌似与我无关,因为我能够顺利获取自己的token了,而是无法连接到七牛云那里去。但我也试过在后台连接七牛云上传并无问题。因为对JS不熟悉,一下子也说不清楚到底是什么问题了。或者我可以用Jquery的里一个构造“表单”方法去通过表单方式上传也可以,但我不明白为什么上面的会不行。

略捉狂。求解答,谢谢!

==================

怪我咯
怪我咯

走同样的路,发现不同的人生

membalas semua(2)
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!