2
回答
1
回答
2
回答
2
回答
5
回答
1
回答
12
回答
2
回答
1
回答
base64先转码成指定格式图片,然后调用OSS上传接口进行上传。更多信息,请参见Github示例。
/**
* base64 to file
* @param dataurl base64 content
* @param filename set up a meaningful suffix, or you can set mime type in options
* @returns {File|*}
*/
const dataURLtoFile = function dataURLtoFile(dataurl, filename) {
const arr = dataurl.split(',');
const mime = arr[0].match(/:(.*?);/)[1];
const bstr = atob(arr[1]);
let n = bstr.length;
const u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], { type: mime });// if env support File, also can use this: return new File([u8arr], filename, { type: mime });
};
// client表示OSS client实例
const uploadBase64Img = function uploadBase64Img(client) {
// base64格式的内容
const base64Content = 'data:image:xxxxxxxxxxxxx';
const filename = 'img.png';
const imgfile = dataURLtoFile(base64Content, filename);
//key表示上传的object key ,imgFile表示dataURLtoFile处理后返回的图片
client.multipartUpload(key, imgfile).then((res) => {
console.log('upload success: %j', res);
}).catch((err) => {
console.error(err);
});
};
1
回答
给要上传的Object名称前加指定目录前缀即可。更多信息,请参见OSS和文件系统对比。
let OSS = require('ali-oss')
let client = new OSS({
region: '<Your region>',
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: 'Your bucket name'
});
client.multipartUpload('base-dir/' +'object-key', 'local-file', {
progress: async function (p) {
console.log('Progress: ' + p);
}
});
console.log(result);
}).catch((err) => {
console.log(err);
});
1
回答
1
回答
1
回答
1
回答
初始化SDK时,可传入以下几个参数:
region:指您申请OSS服务时的区域,例如oss-cn-hangzhou。完整的区域列表可以在OSS服务节点查看。
internal:配合region使用,如果指定 internal 为 true,则访问内网节点。
secure:配合region使用,如果指定了secure为true,则使用HTTPS访问。
const client = new OSS({
region,
accessKeyId: creds.AccessKeyId,
accessKeySecret: creds.AccessKeySecret,
stsToken: creds.SecurityToken,
bucket,
secure:true
});
1
回答
1
回答
1
回答
给要上传的 object 名称前加指定目录前缀即可,可参考OSS 和文件系统对比。
let OSS = require('ali-oss')
let client = new OSS({
region: '<Your region>',
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: '<Your bucket name>',
});
client.multipartUpload('base-dir/' +'object-name', 'local-file', {
progress: async function (p) {
console.log('Progress: ' + p);
}
});
console.log(result);
}).then((res) => {
console.log(res)
}). catch((err) => {
console.log(err);
});
1
回答
1
回答
1
回答
1
回答
1
回答
1
回答
1
回答
1
回答
1
回答
1
回答
1
回答
1
回答
1
回答
1
回答
1
回答
1
回答
1
回答
1
回答
1
回答
调用OSS Java SDK的程序,运行一段时间(根据业务量,几小时到几天不等)后内存泄露。 推荐使用Eclipse Memory Analyzer (MAT)分析内存使用情况。更多信息,请参见使用MAT进行堆转储文件分析。
如果分析结果类似下图所示(PoolingHttpClientConnectionManager占96%的内存),原因是程序中可能多次执行new OSSClient,但是没有调用ossClient.shutdown,造成内存泄漏。
new OSSClient操作完成后,请通过shutdown进行关闭,保证new OSSClient和ossClient.shutdown成对使用。
1
回答
1
回答
调用OSS Java SDK不响应。通过jstack -l pid命令查看堆栈,问题出现在如下的位置:
"main" prio=6 tid=0x000000000291e000 nid=0xc40 waiting on condition [0x0000000002dae000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007d85697f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at org.apache.http.pool.PoolEntryFuture.await(PoolEntryFuture.java:138)
at org.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:306)
at org.apache.http.pool.AbstractConnPool.access$000(AbstractConnPool.java:64)
at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:192)
at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:185)
at org.apache.http.pool.PoolEntryFuture.get(PoolEntryFuture.java:107)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:276)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:263)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:113)
at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:123)
at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:68)
at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:94)
at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:146)
at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:113)
at com.aliyun.oss.internal.OSSObjectOperation.getObject(OSSObjectOperation.java:229)
at com.aliyun.oss.OSSClient.getObject(OSSClient.java:629)
at com.aliyun.oss.OSSClient.getObject(OSSClient.java:617)
at samples.HelloOSS.main(HelloOSS.java:49)
原因是连接池中连接泄漏,可能是使用ossObject后没有关闭。
请检查您的程序,确保没有连接泄漏。关闭方法如下:
// 读取文件
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
// OSS操作
// 关闭ossObject
ossObject.close();
问题排查的具体步骤,请参见OSS Java SDK不响应问题排查。
1
回答
1
回答
1
回答
1
回答
1
回答
1
回答
1
回答
错误原因是OSS Java SDK使用了Apache httpclient 4.4.1,而您的工程使用了与Apache httpclient 4.4.1冲突的Apache httpclient或commons-httpclient jar包。要查看工程使用的jar包及版本,请在您的工程目录下执行mvn dependency:tree。如下图所示,您的工程里使用了Apache httpclient 4.3:
可能存在冲突,请删除commons-httpclient。2、解除依赖冲突。如果您的工程依赖多个第三方包,而第三方包又依赖不同版本的Apache httpclient,您的工程里会有依赖冲突,请使用exclusion解除。更多信息,请参见Maven Guides。
OSS Java SDK依赖以下版本的包,冲突解决办法与httpclient类似。
1
回答
1
回答
1
回答
1
回答
1
回答
有两种可能:
解决:请输入正确的信息后再重试。
解决:当使用子账户访问时,请在控制页面中指定Bucket endpoints, 即告诉FTP Server某个Bucket应该用哪个Endpoint来访问。同时,子账户也需要一些必须的权限。关于使用RAM访问OSS时的访问控制,请参考文档访问控制。具体如下:
a.只读访问:OSS FTP工具需要的权限为ListObjects、GetObject、HeadObject。关于RAM策略配置请参见如何构建RAM Policy。
b.上传文件:如果允许RAM子账户上传文件,还需要PutObject权限。
c.删除文件:如果允许RAM子账户删除文件,还需要DeleteObject权限。
阿里云帮助中心: https://help.aliyun.com/
阿里云内容设计团队出没于此,一大波优质阿里云相关内容随时袭来~