php获取七牛上传token失效,七牛通过bucket:key获取上传凭证更新图片失败

我希望通过设置key为bucket:key的方式来获取可用于更新的文件token,但是用以下代码获取的token返回到android客户端后(客户端安卓,服务器端PHP,客户端先向服务器获取up token,然后凭token上传具体文件),新上传的图片没有覆盖原图。请问是哪儿有问题了呢?

php端:

$bucket = "phpsdk";

$accessKey = QINIU_ACCESS_KEY;

$secretKey = QINIU_SECRET_KEY;

Qiniu_SetKeys($accessKey, $secretKey);

$key=$this->input->post("file_key");

if($key!=""){

$putPolicy = new Qiniu_RS_PutPolicy($bucket.":".$key);

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

echo $upToken;

}

android端:

//tmpFile是上传的文件, key是我需要更新的文件名,qiniuUploadToken是获取到的上传凭证

UploadManager uploadManager = new UploadManager();

uploadManager.put(tmpFile, key, qiniuUploadToken, new UpCompletionHandler() {

@Override

public void complete(String key, ResponseInfo info, JSONObject response) {

try {

if(response!=null){

final String actualKey=response.getString("key");

Log.d(TAG, "get server side key = "+actualKey);

}, new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError error) { }

});

MessageQueue.getInstance().addToRequestQueue(jsonObjReq, TAG);

}else{

Log.e(TAG, "Error from Qiniu: "+info.error);

}

} catch (JSONException e) {

e.printStackTrace();

}

}

}, new UploadOptions(null, null, false, new UpProgressHandler(){

public void progress(String key, double percent){

Log.i("qiniu", key + " (progress): " + percent);

}

}, new UpCancellationSignal(){

public boolean isCancelled(){

return isQiniuCancelled;

}

}));

回复内容:

我希望通过设置key为bucket:key的方式来获取可用于更新的文件token,但是用以下代码获取的token返回到android客户端后(客户端安卓,服务器端PHP,客户端先向服务器获取up token,然后凭token上传具体文件),新上传的图片没有覆盖原图。请问是哪儿有问题了呢?

php端:

$bucket = "phpsdk";

$accessKey = QINIU_ACCESS_KEY;

$secretKey = QINIU_SECRET_KEY;

Qiniu_SetKeys($accessKey, $secretKey);

$key=$this->input->post("file_key");

if($key!=""){

$putPolicy = new Qiniu_RS_PutPolicy($bucket.":".$key);

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

echo $upToken;

}

android端:

//tmpFile是上传的文件, key是我需要更新的文件名,qiniuUploadToken是获取到的上传凭证

UploadManager uploadManager = new UploadManager();

uploadManager.put(tmpFile, key, qiniuUploadToken, new UpCompletionHandler() {

@Override

public void complete(String key, ResponseInfo info, JSONObject response) {

try {

if(response!=null){

final String actualKey=response.getString("key");

Log.d(TAG, "get server side key = "+actualKey);

}, new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError error) { }

});

MessageQueue.getInstance().addToRequestQueue(jsonObjReq, TAG);

}else{

Log.e(TAG, "Error from Qiniu: "+info.error);

}

} catch (JSONException e) {

e.printStackTrace();

}

}

}, new UploadOptions(null, null, false, new UpProgressHandler(){

public void progress(String key, double percent){

Log.i("qiniu", key + " (progress): " + percent);

}

}, new UpCancellationSignal(){

public boolean isCancelled(){

return isQiniuCancelled;

}

}));

这个有可能是cdn缓存导致的覆盖上传后,访问到的文件仍然是旧的资源,你可以通过url?v=20150309对资源进行访问,如果是访问到的最新的资源,说明资源覆盖成功了;一般资源的缓存刷新时间是10min开始刷新,24h全网刷新,如果你对资源更新的实时性要求比较高,你可以在空间设置的高级设置中刷新下资源的url,另外也可以采用资源url加上查询参数的方式去访问资源。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端生成七牛云上传凭证token)一般需要结合后端来完成,因为生成凭证需要使用七牛云的密钥,为了安全起见,密钥一般保存在后端,前端通过与后端的交互获取凭证。 以下是一个前端与后端结合生成七牛云上传凭证上传图片的示例: 1. 后端代码(Node.js): ```javascript const qiniu = require('qiniu'); const accessKey = 'YOUR_QINIU_ACCESS_KEY'; const secretKey = 'YOUR_QINIU_SECRET_KEY'; function generateQiniuToken() { const mac = new qiniu.auth.digest.Mac(accessKey, secretKey); const options = { scope: 'YOUR_QINIU_BUCKET_NAME', expires: 3600, // 凭证有效时间,单位:秒 }; const putPolicy = new qiniu.rs.PutPolicy(options); const uploadToken = putPolicy.uploadToken(mac); return uploadToken; } // 在路由处理函数中返回生成的上传凭证给前端 app.get('/qiniu/token', (req, res) => { const token = generateQiniuToken(); res.json({ token }); }); ``` 上述代码使用了qiniu-sdk库来生成七牛云上传凭证。你需要替换YOUR_QINIU_ACCESS_KEY、YOUR_QINIU_SECRET_KEY和YOUR_QINIU_BUCKET_NAME为你自己的七牛云密钥和存储空间名称。 2. 前端代码(Vue.js): ```javascript import axios from 'axios'; methods: { uploadImage() { uni.chooseImage({ success: (res) => { const tempFilePaths = res.tempFilePaths; this.getQiniuTokenAndUpload(tempFilePaths[0]); }, }); }, getQiniuTokenAndUpload(filePath) { axios.get('/qiniu/token') // 向后端请求获取上传凭证 .then((response) => { const token = response.data.token; this.uploadToQiniu(token, filePath); }) .catch((error) => { console.log(error); }); }, uploadToQiniu(token, filePath) { const url = 'https://upload.qiniup.com'; const key = Date.now() + '.jpg'; // 设置文件名,这里使用当前时间戳作为文件名 uni.uploadFile({ url, filePath, name: 'file', formData: { token, key, }, success: (res) => { // 上传成功,处理返回的数据 console.log(res.data); }, fail: (err) => { // 上传失败,处理错误信息 console.log(err); }, }); }, } ``` 上述代码使用了axios库发送GET请求获取后端生成的上传凭证,然后调用uni.uploadFile方法将图片上传七牛云存储。 请确保替换YOUR_QINIU_ACCESS_KEY、YOUR_QINIU_SECRET_KEY和YOUR_QINIU_BUCKET_NAME为你自己的七牛云密钥和存储空间名称。同时,你还需要根据实际情况修改后端路由路径和前端请求路径。 这样,当用户点击按钮时,前端会通过后端获取七牛云上传凭证,并将选择的图片上传七牛云存储中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值