java s3存储文件

本文介绍如何使用 AWS Java SDK 进行 Amazon S3 文件的上传、下载及管理操作,包括设置文件权限、获取文件元数据等实用功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

步骤一

引入aws sdk包

<!-- 亚马逊 S3 储存sdk -->
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>1.11.415</version>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

创建类S3Service

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.zip.GZIPInputStream;
import java.util.zip.ZipInputStream;

public class S3Service {

    private final org.slf4j.Logger LOG = LoggerFactory.getLogger(S3Service.class);
    private String AWS_S3_BUCKET_NAME;

    private static AmazonS3 s3;

    /**
     * 加速域名
     */
    private static String ACCELERAT_URL = "****.***.***";

    protected S3Service() {
    }

    public S3Service(String accessKey, String secretKey, String bucketName, String region) {
        this.AWS_S3_BUCKET_NAME = bucketName;
        initS3(accessKey, secretKey, bucketName, region);
    }

    public void initS3(String accessKey, String secretKey, String bucketName, String region) {
        Regions clientRegion = Regions.fromName(region);
        BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
        s3 = AmazonS3ClientBuilder.standard()
            .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
            .withForceGlobalBucketAccessEnabled(true)
            .withRegion(clientRegion)
            .build();
    }


    public String uploadFile(String path, InputStream is, ObjectMetadata om) throws Exception {
        long start = System.currentTimeMillis();
        s3.putObject(new PutObjectRequest(AWS_S3_BUCKET_NAME, path, is, om));
        AccessControlList acl = s3.getObjectAcl(AWS_S3_BUCKET_NAME, path);
        //设置文件权限为所有人可访问,此处操作须aws控制台开启acl权限,如果控制台设置公共访问,此处可以不用设置权限
        acl.grantPermission(GroupGrantee.AllUsers, Permission.Read);
        s3.setObjectAcl(AWS_S3_BUCKET_NAME, path, acl);
        //生成公用的url
        URL url = s3.getUrl(AWS_S3_BUCKET_NAME, path);
        LOG.info("AWS S3 Upload File spend time:{}ms", System.currentTimeMillis() - start);
        return accelerateUrlReplace(url.toString());
    }

    public String uploadFile(String path, String bucketName, InputStream is, ObjectMetadata om) throws Exception {
        long start = System.currentTimeMillis();
        s3.putObject(new PutObjectRequest(bucketName, path, is, om));
        AccessControlList acl = s3.getObjectAcl(bucketName, path);
        //设置文件权限为所有人可访问
        acl.grantPermission(GroupGrantee.AllUsers, Permission.Read);
        s3.setObjectAcl(bucketName, path, acl);
        //生成公用的url
        URL url = s3.getUrl(AWS_S3_BUCKET_NAME, path);
        LOG.info("AWS S3 Upload File spend time:{}ms", System.currentTimeMillis() - start);
        return accelerateUrlReplace(url.toString());
    }

    public S3Object downloadFile(String path) throws Exception {
        long start = System.currentTimeMillis();
        S3Object s3Object = s3.getObject(new GetObjectRequest(AWS_S3_BUCKET_NAME, path));
        LOG.info("AWS S3 Download File spend time:{}ms", System.currentTimeMillis() - start);
        return s3Object;
    }

    public S3Object downloadFile(String path, String bucketName) throws Exception {
        long start = System.currentTimeMillis();
        S3Object s3Object = s3.getObject(new GetObjectRequest(bucketName, path));
        LOG.info("AWS S3 Download File spend time:{}ms", System.currentTimeMillis() - start);
        return s3Object;
    }

    /**
     * 下载S3文件到本地
     * @param s3Path    S3路径
     * @param localPath 文件本地路径
     */
    public void storageS3FileToLocal(String s3Path, String localPath) {
        File file = new File(localPath);
        if (!file.exists()) {
            File folder = new File(StringUtils.substringBeforeLast(localPath, File.separator));
            if (!folder.exists()) {
                folder.mkdirs();
            }
            long start = System.currentTimeMillis();
            try (S3Object s3Object = s3.getObject(new GetObjectRequest(AWS_S3_BUCKET_NAME, s3Path));
                 InputStream is = s3Object.getObjectContent();
                 OutputStream os = new FileOutputStream(localPath)) {
                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = is.read(buffer)) != -1) {
                    os.write(buffer, 0, bytesRead);
                }
                os.flush();
            } catch (Exception e) {
                LOG.error("Download S3 File To Local Error|s3Path:{}, localPath:{}", s3Path, localPath, e);
            }
            LOG.info("Download And Storage S3 File To Local spend time:{}ms", System.currentTimeMillis() - start);
        } else {
            file.setLastModified(System.currentTimeMillis());
        }
    }

    /**
     * 下载S3压缩文件到本地并解压
     * @param s3Path    S3路径
     * @param localPath 文件本地路径
     */
    public void storageS3ZipFileToLocal(String s3Path, String localPath) {
        File file = new File(localPath);
        if (!file.exists()) {
            File folder = new File(StringUtils.substringBeforeLast(localPath, File.separator));
            if (!folder.exists()) {
                folder.mkdirs();
            }
            long start = System.currentTimeMillis();
            if (StringUtils.endsWith(s3Path, ".zip")) {
                try (S3Object s3Object = s3.getObject(new GetObjectRequest(AWS_S3_BUCKET_NAME, s3Path));
                     ZipInputStream zis = new ZipInputStream(s3Object.getObjectContent())) {
                    while (zis.getNextEntry() != null) {
                        try (FileOutputStream fos = new FileOutputStream(file)) {
                            byte[] buf = new byte[1024];
                            int bytesRead;
                            while ((bytesRead = zis.read(buf)) != -1) {
                                fos.write(buf, 0, bytesRead);
                            }
                            fos.flush();
                        } catch (Exception e) {
                            LOG.error("Storage S3 Zip NextEntry File To Local Error|s3Path:{}, localPath:{}", s3Path, localPath, e);
                        }
                    }
                } catch (Exception e) {
                    LOG.error("Storage S3 Zip File To Local Error|s3Path:{}, localPath:{}", s3Path, localPath, e);
                }
            } else {
                //.gz .dat .txt
                try (S3Object s3Object = s3.getObject(new GetObjectRequest(AWS_S3_BUCKET_NAME, s3Path));
                     BufferedInputStream bis = new BufferedInputStream(new GZIPInputStream(s3Object.getObjectContent()));
                     BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file))) {
                    int bytesRead;
                    byte[] buf = new byte[1024];
                    while ((bytesRead = bis.read(buf)) != -1) {
                        bos.write(buf, 0, bytesRead);
                    }
                    bos.flush();
                } catch (Exception e) {
                    LOG.error("Storage S3 (GZ DAT TXT) File To Local Error|s3Path:{}, localPath:{}", s3Path, localPath, e);
                }
            }
            LOG.info("Download And Storage S3 Zip File To Local spend time:{}ms", System.currentTimeMillis() - start);
        } else {
            file.setLastModified(System.currentTimeMillis());
        }
    }

    public ObjectMetadata getObjectMetadata(String path) {
        long start = System.currentTimeMillis();
        ObjectMetadata om = null;
        try {
            om = s3.getObjectMetadata(AWS_S3_BUCKET_NAME, path);
        } catch (Throwable te) {
        }
        LOG.info("AWS S3 Get File Meta spend time:{}ms", System.currentTimeMillis() - start);
        return om;
    }

    public String getFileNameByType(String platform, String type, String suffix) {
        String dayStr = (new SimpleDateFormat("yyyyMMdd")).format(new Date());
        Long num = System.currentTimeMillis();
        String name = !StringUtils.isEmpty(platform) ? (platform + "/" + type + "/" + dayStr + "/" + num) : (type + "/" + dayStr + "/" + num);
        return name + "." + suffix;
    }

    /**
     * 域名替换,如果直接使用源域名可不用替换
     */
    private String accelerateUrlReplace(String url) {
        if (!EnvUtil.isTestOrQa()) {
            int startIndex = url.indexOf("://") + 3;
            int endIndex = url.indexOf(".com") + 4;
            url = url.replaceFirst(url.substring(startIndex, endIndex), ACCELERAT_URL);
        }
        return url;
    }
}

#配置s3 S3ServiceConf

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class S3ServiceConf {

    @Value("${s3.AWS_S3_ACCESS_KEY}")
    private String AWS_S3_ACCESS_KEY; //key
    @Value("${s3.AWS_S3_SECRET_KEY}") //SECRET
    private String AWS_S3_SECRET_KEY;
    @Value("${s3.AWS_S3_BUCKET_NAME}") //桶名称
    private String AWS_S3_BUCKET_NAME;
    @Value("${s3.REGION}")
    private String REGION; //区域

    //主要使用
    @Bean("s3Service")
    public S3Service s3Service() {
        return new S3Service(AWS_S3_ACCESS_KEY, AWS_S3_SECRET_KEY, AWS_S3_BUCKET_NAME, REGION);
    }

}

使用

	@Autowired
    private S3Service s3Service;
    
 	String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
    String fileNameStr = s3Service.getFileNameByType("polymer", "uediter", suffix);

    //设置Amazon S3存储的对象元数据
    ObjectMetadata om = new ObjectMetadata();
    om.setContentLength(file.getSize());
    om.setContentType(file.getContentType());
    om.setLastModified(new Date());
    url = s3Service.uploadFile(fileNameStr, file.getInputStream(), om);
### 回答1: Java S3是Amazon Simple Storage Service(简称S3)的Java开发工具包(SDK)。它可以帮助开发者在Java应用程序中实现对S3存储桶中的文件进行预览。 要实现文件预览功能,首先需要确保已在Java项目中引入S3Java SDK。然后,通过SDK提供的API,可以对S3存储桶中的文件进行读取和处理。 实现文件预览的基本步骤如下: 1. 首先,建立与S3的连接。使用SDK提供的CredentialProvider,提供S3的访问凭证,包括访问密钥和密钥ID。 2. 然后,使用S3Client对象来访问S3存储桶。通过指定存储桶名称和文件路径,可以获取到目标文件的对象。 3. 接下来,根据文件的内容类型来确定文件的预览方式。例如,如果文件是图片,可以使用图像处理库来生成缩略图或将其显示在页面上;如果是文本文件,可以读取文件内容并在页面上显示。 4. 将处理后的文件预览展示在用户界面上。可以使用Java Swing、JavaFX或Web界面技术(如JSP、Servlet、Spring MVC)来实现。 5. 最后,关闭与S3的连接,释放资源。 需要注意一些细节事项: - 在处理大文件时,可以使用分块上传和下载来提高性能和效率。 - 要根据文件的MIME类型来决定如何预览文件。可以使用Java文件处理库(如Apache Tika)来确定文件的MIME类型。 - 预览文件时,可能需要进行文件格式转换,以适应不同的预览方式。可以使用相应的Java库来实现文件格式转换。 总之,通过Java S3 SDK,我们可以方便地实现对S3存储桶中文件的预览功能。通过合理的设计和使用适当的Java库,可以让预览功能更加灵活、高效和用户友好。 ### 回答2: 在使用Java S3进行文件预览时,可以通过以下步骤实现: 1. 首先,需要将文件上传到Amazon S3存储桶中。可以使用Amazon S3 Java SDK提供的API来实现文件上传功能。通过指定Bucket名称、文件名称和文件内容来上传文件。 2. 一旦文件上传成功,可以通过在Java程序中使用AWS SDK for Java来进行文件预览。可以使用Amazon S3提供的getObject方法来获取文件的内容。 3. 获取到文件内容后,可以根据不同的文件类型对文件进行预览。根据文件的扩展名,可以使用相应的Java库或工具来解析和展示文件内容。 4. 对于文本文件,可以使用Java IO库或Apache Commons IO来读取文件内容,并进行展示。也可以使用第三方库如ANTLR来解析特定格式的文本文件。 5. 对于图像文件,可以使用Java的ImageIO库来读取文件并进行展示。可以通过将图像文件转换为BufferedImage对象,然后使用Java图形库来展示图像。 6. 对于其他类型的文件,可能需要使用特定类型的库来解析和展示。比如,PDF文件可以使用Apache PDFBox库来解析和展示;视频文件可以使用FFmpeg库来解析和展示。 总之,通过Java S3和相关的Java库,可以实现对文件的预览功能。根据文件类型的不同,使用相应的库和工具来解析和展示文件内容。 ### 回答3Java S3(简称Simple Storage Service)是亚马逊网络服务(AWS)提供的一种对象存储服务。它可以存储和检索任意类型的数据文件,并且具有高可用性、可扩展性和安全性。 要在Java中实现文件预览功能,可以使用S3 SDK提供的方法和类来实现。以下是一个基本的实现步骤: 1. 首先,需要在Java项目中导入AWS S3 SDK的依赖项。可以使用Maven或Gradle等构建工具来完成此步骤。 2. 连接到S3存储桶。通过AWS S3 SDK提供的AmazonS3类创建S3客户端,并使用客户端的方法连接到特定的S3存储桶。 3. 获取要预览的文件。使用AmazonS3客户端的getObject方法来获取存储桶中的文件对象。需要提供存储桶名称和文件键(key)作为参数。 4. 根据文件类型进行预览。根据文件的类型,可以选择不同的方式进行预览。例如,对于文本文件,可以将其内容读取到Java中并在控制台或用户界面上显示。对于图像或视频文件,可以使用Java的图像或视频处理库来展示文件内容。 5. 完成预览功能后,关闭AmazonS3客户端以释放资源。 需要注意的是,预览文件可能涉及到一些文件类型的转换或解析处理,因此根据需要可能需要使用其他Java库或工具来处理不同的文件类型。 总之,借助Java和AWS S3 SDK,可以轻松实现文件预览功能。通过连接到S3存储桶并获取文件对象,然后根据文件类型选择适当的处理方式,即可完成文件的预览操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值