这里给出两种方法
后端Java
-
首先看AWS s3 (这里不放图了)
登录你的AWS 通过账号密码,进入s3 , 并在设置-》安全凭证里面 创建一个密钥 (这个是访问密钥,不是你的登录账号和密码)
创建一个桶,记住你创建的桶名称 因为后面访问的时候需要 桶名称
咱们 上传文件需要 3个参数
访问密钥 和 桶名称
-
打开你的idea
-
2.1 导入依赖
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3 -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.12.523</version>
</dependency>
-
2.2 创建一个测试的类
package com.gupaoedu;
import java.io.*;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.*;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.Upload;
import org.springframework.stereotype.Service;
/**
* @author DELL
* @Desc S3上传文件客户端
*/
@Service
public class TestType {
//访问密钥 的安全凭证中 找 没有则创建一个
private static String AWS_ACCESS_KEY = "*****";
private static String AWS_SECRET_KEY = "*****";
private static final String BUCKETNAME = "visa-application-system"; //桶名
private static AmazonS3 s3;
private static TransferManager tx;
/**
* 通过在代码中包含 access key id 和 secret access key 连接 aws
* @throws Exception
*/
private static void init_with_key() throws Exception {
AWSCredentials credentials = null;
credentials = new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY);
s3 = new AmazonS3Client(credentials);
Region usWest2 = Region.getRegion(Regions.AP_NORTHEAST_1); // 你的时区
s3.setRegion(usWest2);
tx = new TransferManager(s3);
}
/**
* 上传一个本地文件(对应位置为path)上传到名为bucketName的bucket
* @param path
* @param bucketName
*/
private static boolean uploadFileToBucket(String bucketName,String path) {
// 通过你传入的文件路径 打开你的本地文件
File fileToUpload = new File(path);
if(fileToUpload.exists() == false) {
System.out.println(path + " not exists!");
return false;
}
// 桶名、 存入桶里面的文件名字(自定义)(如果时多级目录 传入全路径)、 通过你传入的文件路径打开的文件
PutObjectRequest request = new PutObjectRequest(bucketName,fileToUpload.getName(),fileToUpload);
Upload upload = tx.upload(request);
while((int)upload.getProgress().getPercentTransferred() < 100) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
}
System.out.println(path + " upload succeed!");
return true;
}
// 传入要拉去的文件名
private static Boolean downloadrelease(String bucketname,String filename,String windowspath) throws IOException {
// 下载文件 ( 桶名,文件夹名+文件名 ) 因为这是直接在桶下面 所以 只有文件名
// 如果你是多级目录 需要 传入你的文件夹加你的文件名 例如: test/file。pdf
S3Object s3Object = s3.getObject(new GetObjectRequest(bucketname, filename));
if (s3Object != null) {
InputStream inputStream = null;
FileOutputStream fileOutputStream = null;
byte[] data = null;
try {
// 通过你 要下载桶中文件名称( 可以传多级目录 但需要 截取要下载到本地的文件名 之后和你要下载的本地路径相拼接)
File file = new File(windowspath+"\\"+filename);
if (!file.exists()) {
file.createNewFile();
}
//获取S3object对象文本信息
inputStream = s3Object.getObjectContent();
data = new byte[inputStream.available()];
int len = 0;
fileOutputStream = new FileOutputStream(file.getPath());
while ((len = inputStream.read(data)) != -1) {
fileOutputStream.write(data, 0, len);
}
System.out.println(("*********下载文件成功!*********"));
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();//文件流关闭
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream != null) {
try {
inputStream.close();//文件流关闭
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
return true;
}
public static void main(String[] args) throws Exception {
// 根据你的 访问密匙 初始化S3 对象
init_with_key();
//传入 你要上传 到的桶名称, 和你上传的本地文件全路径
boolean b = uploadFileToBucket(BUCKETNAME, "C:\\Users\\Administrator\\Desktop\\代码\\file2023-08-28.pdf");
if(b){
System.out.println("上传成功");
}else {
System.out.println("上传失败");
}
/*
*
* 下载文件 这里我只传入了三个参数
* 1,桶名称
* 2. 桶中的文件名称 或多级文件目录 文件名称例如 files/pdfs/file.pdf
* 3. 下载到本地路径
* */
Boolean downloadrelease = downloadrelease(BUCKETNAME, "file2023-08-28.pdf", "C:\\Users\\Administrator\\Desktop\\代码");
if(downloadrelease){
System.out.println("下载成功");
}else {
System.out.println("下载失败");
}
System.exit(0);
}
}
-
2.3.其他的一些方法
-
/** * 用于创建一个名为bucketName的s3 bucket * @param bucketName */ private void createBucket(String bucketName) { if(s3.doesBucketExist(bucketName) == true) { System.out.println(bucketName + " already exist!"); return; } System.out.println("creating " + bucketName + " ..."); s3.createBucket(bucketName); System.out.println(bucketName + " has been created!"); } /** * 列出名为bucketName的bucket里面的所有object * @param bucketName */ private void listObjects(String bucketName) { System.out.println("Listing objects of " + bucketName); ObjectListing objectListing = s3.listObjects(bucketName); int objectNum = 0; for(S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) { System.out.println(" - " + objectSummary.getKey()); objectNum ++; } System.out.println("total " + objectNum + " object(s)."); } /** * 判断名为bucketName的bucket里面是否有一个名为key的object * @param bucketName * @param key * @return */ private boolean isObjectExit(String bucketName, String key) { int len = key.length(); ObjectListing objectListing = s3.listObjects(bucketName); String s = new String(); for(S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) { s = objectSummary.getKey(); int slen = s.length(); if(len == slen) { int i; for(i=0;i<len;i++) { if(s.charAt(i) != key.charAt(i)) { break; } } if(i == len) { return true; } } } return false; } /** * 在本地创建一个名为filename的文件,输入一些信息后,将其传到名为bucketName的s3 bucket里面去 * @param bucketName * @param filename * @throws IOException */ private void createSampleFile(String bucketName, String filename) throws IOException { if(isObjectExit(bucketName, filename) == true) { System.out.println(filename +" already exists in " + bucketName + "!"); return; } System.out.println("creating file " + filename); File file = new File(filename); file.deleteOnExit(); Writer writer = new OutputStreamWriter(new FileOutputStream(file)); writer.write("abcdefghijklmnopqrstuvwxyz\n"); writer.write("01234567890112345678901234\n"); writer.write("!@#$%^&*()-=[]{};':',.<>/?\n"); writer.write("01234567890112345678901234\n"); writer.write("abcdefghijklmnopqrstuvwxyz\n"); writer.close(); s3.putObject(bucketName, filename, file); System.out.println("create sample file " + filename + " succeed!"); } /** * 输出"s3://"+bucketname+"/"key对应的object对应的信息 * @param bucketName * @param key */ private static String showContentOfAnObject(String bucketName, String key) { S3Object object = s3.getObject(new GetObjectRequest(bucketName, key)); InputStream input = object.getObjectContent(); return object.getKey(); // BufferedReader reader = new BufferedReader(new InputStreamReader(input)); // try { // while (true) { // String line = reader.readLine(); // if (line == null) { // break; // } // System.out.println(" " + line); // } // System.out.println(); // } catch (IOException e) { // e.printStackTrace(); // } } /** * 输出"s3://"+bucketname+"/"key对应的object对应的信息(这个object对应的文件时gzip格式的) * @param bucketName * @param key */ private void showContentOfAnGzipObject(String bucketName, String key) { try { S3Object object = s3.getObject(new GetObjectRequest(bucketName, key)); InputStream input = new GZIPInputStream(object.getObjectContent()); BufferedReader reader = new BufferedReader(new InputStreamReader(input)); while (true) { String line = reader.readLine(); if (line == null) { break; } System.out.println(" " + line); } System.out.println(); } catch (IOException e) { e.printStackTrace(); } } /** * 删除一个名为bucketName的bucket * @param bucketName */ private void deleteBucket(String bucketName) { if(s3.doesBucketExist(bucketName) == false) { System.out.println(bucketName + " does not exists!"); return; } System.out.println("deleting " + bucketName + " ..."); ObjectListing objectListing = s3.listObjects(bucketName); for(S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) { String key = objectSummary.getKey(); s3.deleteObject(bucketName, key); } s3.deleteBucket(bucketName); System.out.println(bucketName + " has been deleted!"); } /** * 删除名为bucketName的bucket里面所有key的前缀和prefix匹配的object * @param bucketName * @param prefix */ private void deleteObjectsWithPrefix(String bucketName, String prefix) { if(s3.doesBucketExist(bucketName) == false) { System.out.println(bucketName + " does not exists!"); return; } System.out.println("deleting " + prefix +"* in " + bucketName + " ..."); int pre_len = prefix.length(); ObjectListing objectListing = s3.listObjects(bucketName); for(S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) { String key = objectSummary.getKey(); int len = key.length(); if(len < pre_len) { continue; } int i; for(i=0;i<pre_len;i++) { if(key.charAt(i) != prefix.charAt(i)) { break; } } if(i < pre_len) { continue; } s3.deleteObject(bucketName, key); } System.out.println("All " + prefix + "* deleted!"); } /** * 列出我的s3上所有的bucket的名字 */ private void listBuckets() { System.out.println("Listing buckets"); int bucketNum = 0; for(Bucket bucket : s3.listBuckets()) { System.out.println(" - " + bucket.getName()); bucketNum ++; } System.out.println("total " + bucketNum + " bucket(s)."); } /** * 在aws上创建一个目录 * @param bucketName * @param folderId */ private static String createFolder(String bucketName, Integer folderId) { // Create metadata for my folder & set content-length to 0 ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentLength(0); // Create empty content InputStream emptyContent = new ByteArrayInputStream(new byte[0]); // Create a PutObjectRequest passing the foldername suffixed by / String folderName=FOLDERNameLIST+folderId+"/"; // 创建文件目录 PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, folderName, emptyContent, metadata); // Send request to S3 to create folder s3.putObject(putObjectRequest); return folderName; }
前端Vue 下载(不是上传)
1. 首先,确保已安装AWS SDK for JavaScript。
npm install aws-sdk
2.导入包
// 在<script> 标签中 导入 前提是 你把aws install 在你的项目中
import AWS from 'aws-sdk';
3. 定义单机事件方法
// 在vue method 代码块中 定义 单机按钮 调用方法
downloadImage(filename) {
// 配置AWS SDK
AWS.config.update({
// 你的访问密钥
accessKeyId: '******',
secretAccessKey: '*****',
region: 'ap-northeast-1' // 你的时区
});
const s3 = new AWS.S3();
// 桶名
const bucketName = '***';
//文件名 或者文件全路径名 桶名/ [文件夹名/] *.*
const key = '***/*.*';
// 创建下载链接
const params = {
Bucket: bucketName,
Key: key
};
s3.getSignedUrl('getObject', params, (err, url) => {
if (err) {
console.error('无法生成签名URL:', err);
} else {
// 使用生成的URL下载图片
window.open(url);
}
});
}