七牛云可不可以 我上传了照片上去过后 自动帮我做一个size的压缩
还没!求救
现在问题是 微信小程序上传图片压缩的时候 不知道怎么办。后端懒得写
七牛云可不可以 我上传了照片上去过后 自动帮我做一个size的压缩
还没!求救
现在问题是 微信小程序上传图片压缩的时候 不知道怎么办。后端懒得写
AccessKey
和 SecretKey
const qiniu = require('qiniu');
// 配置七牛云
const accessKey = 'your_access_key';
const secretKey = 'your_secret_key';
const bucket = 'your_bucket_name';
const mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
const config = new qiniu.conf.Config();
const bucketManager = new qiniu.rs.BucketManager(mac, config);
// 生成上传token
function getUploadToken() {
const options = {
scope: bucket,
expires: 7200, // 2小时有效期
};
const putPolicy = new qiniu.rs.PutPolicy(options);
return putPolicy.uploadToken(mac);
}
// 上传接口
app.post('/api/upload', (req, res) => {
const token = getUploadToken();
res.json({
code: 200,
data: {
token: token,
domain: 'https://your-bucket.qiniucdn.com' // 你的CDN域名
}
});
});
// pages/upload/upload.js
Page({
data: {
imageUrl: ''
},
// 选择并上传图片
chooseAndUploadImage() {
const that = this;
// 1. 先获取上传token
wx.request({
url: 'https://your-api.com/api/upload',
method: 'POST',
success: function(tokenRes) {
if (tokenRes.data.code === 200) {
const uploadToken = tokenRes.data.data.token;
const domain = tokenRes.data.data.domain;
// 2. 选择图片
wx.chooseMedia({
count: 1,
mediaType: ['image'],
sourceType: ['album', 'camera'],
success: function(chooseRes) {
const tempFilePath = chooseRes.tempFiles[0].tempFilePath;
// 3. 先压缩图片(可选,减少上传时间)
wx.compressImage({
src: tempFilePath,
quality: 80,
success: function(compressRes) {
// 4. 上传到七牛云
that.uploadToQiniu(compressRes.tempFilePath, uploadToken, domain);
},
fail: function() {
// 压缩失败就直接上传原图
that.uploadToQiniu(tempFilePath, uploadToken, domain);
}
});
}
});
}
}
});
},
// 上传到七牛云
uploadToQiniu(filePath, token, domain) {
const that = this;
const fileName = 'image_' + Date.now() + '.jpg';
wx.uploadFile({
url: 'https://upload.qiniup.com', // 七牛云上传域名
filePath: filePath,
name: 'file',
formData: {
token: token,
key: fileName
},
success: function(uploadRes) {
if (uploadRes.statusCode === 200) {
// 5. 上传成功,构造图片URL
const originalUrl = domain + '/' + fileName;
// 6. 根据需要添加压缩参数
const compressedUrl = that.getCompressedUrl(originalUrl, 'medium');
that.setData({
imageUrl: compressedUrl
});
wx.showToast({
title: '上传成功',
icon: 'success'
});
}
},
fail: function(error) {
wx.showToast({
title: '上传失败',
icon: 'error'
});
console.error('上传失败:', error);
}
});
},
// 获取不同压缩级别的URL
getCompressedUrl(originalUrl, size) {
const compressParams = {
'thumbnail': '?imageView2/2/w/150/h/150/q/60', // 缩略图
'small': '?imageView2/2/w/300/q/70', // 小图
'medium': '?imageView2/2/w/750/q/80', // 中图
'large': '?imageView2/2/w/1200/q/85', // 大图
'avatar': '?imageView2/2/w/100/h/100/q/75' // 头像
};
return originalUrl + (compressParams[size] || compressParams['medium']);
}
});
<!-- pages/upload/upload.wxml -->
<view class="container">
<button bindtap="chooseAndUploadImage">选择并上传图片</button>
<image wx:if="{{imageUrl}}" src="{{imageUrl}}" mode="aspectFit" class="uploaded-image"></image>
</view>
/* pages/upload/upload.wxss */
.container {
padding: 20rpx;
}
.uploaded-image {
width: 100%;
height: 400rpx;
margin-top: 20rpx;
}
// 工具函数:根据场景获取合适的图片URL
function getImageUrl(originalUrl, scene) {
const baseUrl = originalUrl.split('?')[0]; // 去掉可能已存在的参数
switch(scene) {
case 'avatar':
return baseUrl + '?imageView2/2/w/100/h/100/q/75';
case 'list':
return baseUrl + '?imageView2/2/w/300/q/70';
case 'detail':
return baseUrl + '?imageView2/2/w/750/q/85';
case 'fullscreen':
return baseUrl + '?imageView2/2/w/1200/q/90';
default:
return baseUrl + '?imageView2/2/w/750/q/80';
}
}
// 使用示例
const originalUrl = 'https://your-bucket.qiniucdn.com/image123.jpg';
const avatarUrl = getImageUrl(originalUrl, 'avatar');
const listUrl = getImageUrl(originalUrl, 'list');
场景 | 参数 | 说明
-------------|----------------------------------------|------------------
头像 | ?imageView2/2/w/100/h/100/q/75 | 100x100, 75%质量
列表缩略图 | ?imageView2/2/w/300/q/70 | 宽300px, 70%质量
详情页 | ?imageView2/2/w/750/q/85 | 宽750px, 85%质量
全屏查看 | ?imageView2/2/w/1200/q/90 | 宽1200px, 90%质量
超小缩略图 | ?imageView2/2/w/150/h/150/q/60 | 150x150, 60%质量
// 后端返回图片信息时直接提供多种尺寸
app.get('/api/images/:id', (req, res) => {
const imageId = req.params.id;
const baseUrl = `https://your-bucket.qiniucdn.com/${imageId}.jpg`;
res.json({
code: 200,
data: {
original: baseUrl,
thumbnail: baseUrl + '?imageView2/2/w/150/h/150/q/60',
small: baseUrl + '?imageView2/2/w/300/q/70',
medium: baseUrl + '?imageView2/2/w/750/q/80',
large: baseUrl + '?imageView2/2/w/1200/q/85'
}
});
});
开启配置简单:在七牛云空间管理控制台中,找到目标存储空间的域名管理(或内容分发)设置项,开启“图片瘦身”功能即可
自动执行无需参数:开启后,七牛云会自动对存储空间内的图片进行压缩优化,用户无需在上传或访问链接中添加任何额外的压缩参数
优化效果显著:该功能旨在保持肉眼观察的画质基本不变(无损或接近无损)的前提下,显著减小图片文件体积,从而节省CDN流量消耗
格式自适应:七牛云还支持根据客户端请求头(如accept: image/heic)或图片类型,自动适配最优压缩格式(例如WebP、AVIF等),进一步节省流量
总结:七牛云通过后台配置的“图片瘦身”功能,可以实现上传图片的自动、智能压缩,操作便捷且效果显著
4 回答830 阅读✓ 已解决
6 回答1.3k 阅读
5 回答754 阅读
3 回答839 阅读✓ 已解决
3 回答1k 阅读
1 回答830 阅读✓ 已解决
1 回答932 阅读✓ 已解决
支持的
一、七牛云图片处理功能
七牛云的图片处理功能非常强大,它允许开发者对存储在七牛云上的图片进行各种处理,包括压缩。开发者可以通过编辑图片的URL来添加处理参数,从而实现图片的自动压缩。
二、JavaScript SDK图片压缩
七牛云还提供了JavaScript SDK,允许开发者在客户端进行图片压缩。这种方式主要依赖于WebAssembly技术在浏览器中运行,无需服务器参与,即可实现高效的图片压缩。客户端处理可以减少服务器负载,提高响应速度,并且用户可以在上传前预览压缩效果。
三、图片压缩的具体实现
质量压缩:通过降低图片质量来减小文件大小。这种方式在七牛云的图片处理URL参数和JavaScript SDK中都可以实现。
尺寸压缩:调整图片分辨率以达到压缩目的。这同样可以通过编辑图片的URL参数或使用JavaScript SDK来实现。
格式转换:将图片转换为更高效的格式,如WebP。七牛云的图片处理功能支持多种图片格式的转换,从而帮助开发者进一步优化图片大小。