获取一个指定了 HTTP 方法、到期时间和自定义请求参数的对象URL地址,也就是返回带签名的URL,这个地址可以提供给没有登录的第三方共享访问或者上传对象。
后端:
/**
* 获得上传的签名URL
* @param fileName 文件名
* @param durationSeconds 签名有效期秒
* @return
*/
public static MinioPresignedObjectUrl getPresignedObjectUrl2upload(String fileName, Integer durationSeconds) {
initMinio(minioUrl, minioName,minioPass);
MinioPresignedObjectUrl minioUrl = new MinioPresignedObjectUrl();
String objectName = fileName2objectName("",fileName);
String url =
null;
try {
url = minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.PUT)
.bucket(bucketName)
.object(objectName)
.expiry(durationSeconds, TimeUnit.SECONDS)
.build());
minioUrl.setPresignedObjectUrl(url);
minioUrl.setPresignedObjectUrl(minioUrlDomain+bucketName+"/"+objectName);
} catch (ErrorResponseException e) {
e.printStackTrace();
} catch (InsufficientDataException e) {
e.printStackTrace();
} catch (InternalException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (InvalidResponseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (XmlParserException e) {
e.printStackTrace();
} catch (ServerException e) {
e.printStackTrace();
}
return minioUrl;
}
/**
* 获得下载的URL
* @param fileName 文件名
* @param durationSeconds 签名有效期秒
* @return
*/
public static MinioPresignedObjectUrl getPresignedObjectUrl2download(String fileName, Integer durationSeconds) {
Map<String, String> reqParams = new HashMap<String, String>();
reqParams.put("response-content-type", "application/json");
MinioPresignedObjectUrl minioUrl = new MinioPresignedObjectUrl();
String objectName = fileName2objectName("",fileName);
String url = null;
try {
url = minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucketName)
.object(objectName)
.expiry(durationSeconds, TimeUnit.SECONDS)
.extraQueryParams(reqParams)
.build());
minioUrl.setPresignedObjectUrl(url);
minioUrl.setPresignedObjectUrl(minioUrlDomain+bucketName+"/"+objectName);
} catch (ErrorResponseException e) {
e.printStackTrace();
} catch (InsufficientDataException e) {
e.printStackTrace();
} catch (InternalException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (InvalidResponseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (XmlParserException e) {
e.printStackTrace();
} catch (ServerException e) {
e.printStackTrace();
}
return minioUrl;
}
/**
* 获取查看文件元数据url
* @param fileName 文件名
* @param durationSeconds 签名有效期秒
* @return
*/
public static MinioPresignedObjectUrl getPresignedObjectUrl2metadata(String fileName, Integer durationSeconds) {
Map<String, String> reqParams = new HashMap<String, String>();
reqParams.put("response-content-type", "application/json");
MinioPresignedObjectUrl minioUrl = new MinioPresignedObjectUrl();
String objectName = fileName2objectName("",fileName);
String url =
null;
try {
url = minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.HEAD)
.bucket(bucketName)
.object(objectName)
.expiry(durationSeconds, TimeUnit.SECONDS)
.extraQueryParams(reqParams)
.build());
minioUrl.setPresignedObjectUrl(url);
minioUrl.setPresignedObjectUrl(minioUrlDomain+bucketName+"/"+objectName);
} catch (ErrorResponseException e) {
e.printStackTrace();
} catch (InsufficientDataException e) {
e.printStackTrace();
} catch (InternalException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (InvalidResponseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (XmlParserException e) {
e.printStackTrace();
} catch (ServerException e) {
e.printStackTrace();
}
return minioUrl;
}
前端:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="file" id="selector" multiple>
<button onclick="upload()">Upload</button>
<div id="status">No uploads</div>
<script type="text/javascript">
// `upload` iterates through all files selected and invokes a helper function called `retrieveNewURL`.
function upload() {
// Get selected files from the input element.
var files = document.querySelector("#selector").files;
for (var i = 0; i < files.length; i++) {
var file = files[i];
// 从服务器获取一个URL
retrieveNewURL(file, (file, url) => {
// 上传文件到服务器
uploadFile(file, url);
});
}
}
// 发请求到Node.js server获取上传URL。
// `retrieveNewURL` accepts the name of the current file and invokes the `/presignedUrl` endpoint to
// generate a pre-signed URL for use in uploading that file:
function retrieveNewURL(file, cb) {
cb(file,"http://zzdust.oss.jinhukeji.net:9000/test/test.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=hinmuminio%2F20220801%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220801T082305Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=98fca4ad9f5212d9e0eae9729350d866a6a333676aa1fc7547692ce453b75a17")
}
// 使用Fetch API来上传文件到S3。
// ``uploadFile` accepts the current filename and the pre-signed URL. It then uses `Fetch API`
// to upload this file to S3 at `play.min.io:9000` using the URL:
function uploadFile(file, url) {
if (document.querySelector('#status').innerText === 'No uploads') {
document.querySelector('#status').innerHTML = '';
}
fetch(url, {
method: 'PUT',
body: file
}).then(() => {
// If multiple files are uploaded, append upload status on the next line.
document.querySelector('#status').innerHTML += `<br>Uploaded ${file.name}.`;
}).catch((e) => {
console.error(e);
});
}
</script>
</body>
</html>