阿里oss 文件存储

本文介绍了如何使用阿里云OSS Java SDK进行文件上传操作,提供了具体的工具类代码示例,帮助开发者实现将文件从本地上传到阿里云OSS存储服务。

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

 <!--阿里oss-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>

工具类

import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import lombok.Getter;
import lombok.Setter;
import org.springframework.stereotype.Component;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

@Getter
@Setter
@Component
public class OssUtil {

    private static String endpoint = "oss-cn-hangzhou.aliyuncs.com";
    private static String accessKeyId = "需要申请";
    private static String accessKeySecret = "需要申请";
    private static String bucketName = "需要申请";


    public static OSSClient client;
    public OSSClient initClient(){
        if(null==client){
            ClientConfiguration conf = new ClientConfiguration();
            conf.setConnectionTimeout(5000);
            conf.setMaxErrorRetry(10);
            client = new OSSClient("http://" + endpoint, accessKeyId, accessKeySecret,conf);
        }
        return client;
    }

    public boolean putObjectForInputStream(String fileKey, InputStream content) {
        if (null == fileKey || "" == fileKey.trim())
            return false;
        try {
            initClient();
            ObjectMetadata meta = new ObjectMetadata();
            meta.setContentType("image/jpg");
            client.putObject(bucketName, fileKey, content, meta);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
 

    public  String  putObjectForImage(String imageName, InputStream content, boolean if400) {
        if (null == imageName || "" == imageName.trim())
            return null;
        try {
            String file = "images/" + imageName.substring(0, imageName.indexOf(".")) + "/" + imageName;
            putObjectForInputStream(file,content);
            return "http://"+bucketName+"."+endpoint+"/"+file;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
 
 
    public String getObject(String key) {
        try {
            OSSObject object = client.getObject(bucketName, key);
            InputStream objectContent = object.getObjectContent();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int i = -1;
            while ((i = objectContent.read()) != -1) {
                baos.write(i);
            }
            objectContent.close();
            return baos.toString("UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
 
 //上传文件使用这个
  public static  String upload(File file){


        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String dateStr = format.format(new Date());

        if(null == file){
            return null;
        }

        OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
        try {
            //容器不存在,就创建
            if(! ossClient.doesBucketExist(bucketName)){
                ossClient.createBucket(bucketName);
                CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
                createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
                ossClient.createBucket(createBucketRequest);
            }
            //创建文件路径
            String fileUrl = "image"+"/"+(dateStr + "/" + UUID.randomUUID().toString().replace("-","")+"-"+file.getName());
            //上传文件
            PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucketName, fileUrl, file));
            //设置权限 这里是公开读
            ossClient.setBucketAcl(bucketName,CannedAccessControlList.PublicRead);
            if(null != result){
                log.info("==========>OSS文件上传成功,OSS地址:"+fileUrl);
                return "http://mawm.oss-cn-hangzhou.aliyuncs.com/"+fileUrl;
            }

//            //返回图片所在的全部路径,方便前端访问
//            //设置过期时间为100年
//            Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 10);
//            // 生成URL
//            //endpoint,accessKeyId,accessKeyId就不说了  我上个博客说了
//            //这些都是一样的
//            OSSClient ossClient1 = new OSSClient(endpoint, accessKeyId, accessKeyId);
//            //这里得到的url就是图片的全路径
//            URL url = ossClient.generatePresignedUrl(bucketName, fileUrl, expiration);
//            if(null != url){
//                log.info("==========>OSS文件上传成功,OSS地址:"+url.toString());
//                return url.toString();
//            }


        }catch (OSSException oe){
            log.error(oe.getMessage());
        }catch (ClientException ce){
            log.error(ce.getMessage());
        }finally {
            //关闭
            ossClient.shutdown();
        }
        return null;
    }
 
    public static void main(String[] args) {
        try {
            //String text = "<p><br/><br/>雪纺印花百褶裙半身裙,简约的线条和版型上身很好看,整体更有看点。时尚真皮女凉鞋 牛筋底中跟欧美潮鞋 2015夏个性森系女鞋子罗马鞋。</p><p><img src=\"/manager/plugins/ueditor/jsp/upload1/20160129/99731454031866641.png\"/></p>";
            //String s = OssUtil.uploadTextImg(text);
 
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
}

    /**
     * 上传图片
     *
     * @param file
     * @return
     */
    @SneakyThrows
    @PostMapping("/upLoadHeader")
    public String upLoadPicture(@RequestParam("file") MultipartFile file) {
        InputStream inputStream = null;
        try {

            byte[] byteArr = file.getBytes();
            inputStream = new ByteArrayInputStream(byteArr);
            String fileName = file.getOriginalFilename();
            String fileUUid = UUID.randomUUID().toString().replace("-","");
            fileName = fileUUid + "." + fileName.split("\\.")[1];
            String upload = ossUtil.putObjectForImage(fileName, inputStream, false);

            return upload;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
            return e.getMessage();
        } finally {
            inputStream.close();
        }

    }
	//上传文件
    @RequestMapping("/updateOssFile")
    public String updateOssFile(MultipartFile file) {
        try {

            if(null != file){
                //获取文件的名字
                String filename = file.getOriginalFilename();
                //  System.out.println("filename"+filename);
                if(!"".equals(filename.trim())){
                    File newFile = new File(filename);
                    FileOutputStream os = new FileOutputStream(newFile);
                    os.write(file.getBytes());
                    os.close();
                    file.transferTo(newFile);
                    //上传到OSS
                    String upload = AliyunOSSUtil.upload(newFile);

                    //上传到oss后,删除遗留在项目中的文件
                    String path = System.getProperty("user.dir");
                    String filepath=path+File.separator+file.getOriginalFilename();
                    File file1=new File(filepath);
                    if(file1.exists())
                    {
                        file1.delete();
                    }else {
                        log.info("============>删除oos上传服务器之后,遗留在项目中的文件失败");
                    }
                    return upload;
                }

            }
        }catch (Exception ex){
            ex.printStackTrace();
        }

        return "1";

    }

下面是上传文件到本地:
工具类

import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

public class UploadImgUtil {


    public static String uploadImg(MultipartFile file) throws IOException {
        //2.根据时间戳创建新的文件名,这样即便是第二次上传相同名称的文件,也不会把第一次的文件覆盖了
        String fileName = System.currentTimeMillis() + file.getOriginalFilename();
        //3.通过req.getServletContext().getRealPath("") 获取当前项目的真实路径,然后拼接前面的文件名
        //String destFileName = "C:\\HBuilderX\\HBuilderProjects\\TP\\"+fileName;
        // String destFileName = ResourceUtils.getURL("classpath:").getPath()+"/static/"+fileName;
        String destFileName = System.getProperty("user.dir")+"/static/"+fileName;
        //4.第一次运行的时候,这个文件所在的目录往往是不存在的,这里需要创建一下目录(创建到了webapp下uploaded文件夹下)
        File destFile = new File(destFileName);
        destFile.getParentFile().mkdirs();
        //5.把浏览器上传的文件复制到希望的位置
        file.transferTo(destFile);
        //6.把文件名放在model里,以便后续显示用
        return "/static"+"/"+fileName;
    }
}

具体调用

  //上传文件返回文件地址
    @RequestMapping("/updateFile")
    public String updateFile(MultipartFile file) throws IOException {
        if (null == file){
            return "没有传输文件";
        }
        String s = UploadImgUtil.uploadImg(file);
        return s;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值