概述
配置跨域
出现问题Access to fetch at ‘https://…’ from origin ‘https://…com’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
ETag
x-oss-request-id
代码
package com.zykj.moon;
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.Credentials;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyuncs.exceptions.ClientException;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.FileEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Date;
public class UploadTest {
@Test
void sign() throws Exception {
// 以华东1(杭州)的外网Endpoint为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 填写Bucket名称,例如examplebucket。
String bucketName = "bucket111-hangzhou";
// 填写Object完整路径,例如exampleobject.txt。Object完整路径中不能包含Bucket名称。
String objectName = "test/example.txt";
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
String region = "cn-hangzhou";
// 创建OSSClient实例。
// 当OSSClient实例不再使用时,调用shutdown方法以释放资源。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(new DefaultCredentialProvider("1", "1"))
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
// 关键:browser需要设置
String contentType = "application/octet-stream";
URL signedUrl = null;
try {
// 指定生成的预签名URL过期时间,单位为毫秒。本示例以设置过期时间为30分钟为例。
Date expiration = new Date(new Date().getTime() + 600 * 1000L);
// 生成预签名URL。
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT);
// 设置过期时间。
request.setExpiration(expiration);
request.setHeaders(headers);// 将请求头加入到request中。
request.setMethod(HttpMethod.PUT); // 明确指定PUT方法
request.setContentType(contentType);
// 通过HTTP PUT请求生成预签名URL。
signedUrl = ossClient.generatePresignedUrl(request);
// 打印预签名URL。
System.out.println("signed url for putObject: " + signedUrl);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
}
}
@Test
void upload() throws IOException {
CloseableHttpClient httpClient = null;
CloseableHttpResponse response = null;
// 将<signedUrl>替换为授权URL。
URL signedUrl = new URL("<sign_url>");
// 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
String pathName = "D:\\example.txt";
try {
HttpPut put = new HttpPut(signedUrl.toString());
System.out.println(put);
HttpEntity entity = new FileEntity(new File(pathName));
put.setEntity(entity);
httpClient = HttpClients.createDefault();
response = httpClient.execute(put);
System.out.println("返回上传状态码:"+response.getStatusLine().getStatusCode());
if(response.getStatusLine().getStatusCode() == 200){
System.out.println("使用网络库上传成功");
}
System.out.println(response.toString());
} catch (Exception e){
e.printStackTrace();
} finally {
response.close();
httpClient.close();
}
}
}
java client
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.internal.OSSHeaders;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyun.oss.model.StorageClass;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.FileEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class UploadTest {
@Test
void upload() throws IOException {
CloseableHttpClient httpClient = null;
CloseableHttpResponse response = null;
// 将<signedUrl>替换为授权URL。
URL signedUrl = new URL("<sign_url>");
// 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
String pathName = "D:\\example111.txt";
Header[] headers = new Header[] {
// 设置Content-Type(必须与预签名URL生成时一致)
new BasicHeader("Content-Type", "application/octet-stream"),
// 可选:设置Content-Length(文件大小,单位字节)
//new BasicHeader("Content-Length", String.valueOf(new File("local-file.jpg").length()))
};
try {
HttpPut put = new HttpPut(signedUrl.toString());
put.setHeaders(headers);
System.out.println(put);
HttpEntity entity = new FileEntity(new File(pathName));
put.setEntity(entity);
httpClient = HttpClients.createDefault();
response = httpClient.execute(put);
System.out.println("返回上传状态码:"+response.getStatusLine().getStatusCode());
if(response.getStatusLine().getStatusCode() == 200){
System.out.println("使用网络库上传成功");
}
System.out.println(response.toString());
} catch (Exception e){
e.printStackTrace();
} finally {
response.close();
httpClient.close();
}
}
}
brower
const signedUrl = <sign_url>
const headers = {
'Content-Type': 'application/octet-stream' // 根据实际情况调整Content-Type
}
return await fetch(signedUrl, {
headers: headers,
method: 'PUT',
body: file, // 直接上传整个文件
});