OSS上传下载图片实例化 ----demo

1、进行使用OSS存储图片
	利用java实现OSS的上传和下载图片操作,在代码中会开始和关闭使用OSS上传下载图片进行本地存储图片还是OSS存储图片。
2. 首先我们需要将相关的OSS包导入到项目中
		<dependency>
		    <groupId>com.aliyun.oss</groupId>
		    <artifactId>aliyun-sdk-oss</artifactId>
		    <version>3.10.2</version>
		</dependency>
		 <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
3.然后我们写相关的实现方法
 /**
     * 上传文件。
     *
     * @param file 需要上传的文件路径
     * @return 如果上传的文件是图片的话,会返回图片的"URL",如果非图片的话会返回"非图片,不可预览。文件路径为:+文件路径"
     */
    public static String upLoad(File file,ApplicationProperties applicationProperties) {
        // 判断文件
        if (file == null) {
            return null;
        }
        // 默认值为:true 是否为图片操作
        boolean isImage = true;
        // 判断所要上传的图片是否是图片,图片可以预览,其他文件不提供通过URL预览
        try {
            Image image = ImageIO.read(file);
            isImage = image == null ? false : true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        log.info("------OSS文件上传开始--------" + file.getName());
        //地址信息
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String dateStr = format.format(new Date());
        // 创建OSSClient实例。
        OSSClient ossClient = new OSSClient(applicationProperties.getOss().getEndPoint(), applicationProperties.getOss().getAccessKeyId(), applicationProperties.getOss().getAccessKeySecret());
        //进行设置可以预览图片操作
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentType("image/jpg");
        try {
            // 判断容器是否存在,不存在就创建
            if (!ossClient.doesBucketExist(applicationProperties.getOss().getBucketName())) {
                ossClient.createBucket(applicationProperties.getOss().getBucketName());
                CreateBucketRequest createBucketRequest = new CreateBucketRequest(applicationProperties.getOss().getBucketName());
                createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
                ossClient.createBucket(createBucketRequest);
            }
            // 设置文件路径和名称
            String fileUrl = applicationProperties.getOss().getFileHost() + "/" + (dateStr + "/" + UUID.randomUUID().toString().replace("-", "") + "-" + file.getName());
            if (isImage) {//如果是图片,则图片的URL为:....
                //FILE_URL = "https://" + bucketName + "." + endPoint + "/" + fileUrl;
                FILE_URL = fileUrl;
            } else {
                FILE_URL = "非图片,不可预览。文件路径为:" + fileUrl;
            }
            // 设置权限(公开读)
            ossClient.setBucketAcl(applicationProperties.getOss().getBucketName(), CannedAccessControlList.PublicRead);
            // 上传文件
            PutObjectResult result = ossClient.putObject(new PutObjectRequest(applicationProperties.getOss().getBucketName(), fileUrl, file, objectMetadata));
            if (result != null) {
                log.info("------OSS文件上传成功------" + fileUrl);
            }
        } catch (OSSException oe) {
            log.error(oe.getMessage());
        } catch (ClientException ce) {
            log.error(ce.getErrorMessage());
        } finally {
            ossClient.shutdown();
        }
        return FILE_URL;
    }

 /**
     * 将文件转为OutputStream
     *
     * @param filePath 文件路径
     * @param os       输出流
     * @throws IOException 异常
     */
    public static void writeBytes(String filePath, OutputStream os,ApplicationProperties applicationProperties) throws IOException {
        // 创建OSSClient实例。
        OSSClient ossClient = new OSSClient(applicationProperties.getOss().getEndPoint(), applicationProperties.getOss().getAccessKeyId(), applicationProperties.getOss().getAccessKeySecret());
        try {
            log.info("------OSS文件下载请求------" + filePath);
            // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
            OSSObject object = ossClient.getObject(applicationProperties.getOss().getBucketName(), filePath);
            if (object == null) {
                throw new FileNotFoundException(filePath);
            }
            try (InputStream fis = object.getObjectContent()) {
                byte[] b = new byte[1024];
                int length;
                while ((length = fis.read(b)) > 0) {
                    os.write(b, 0, length);
                }
                log.info("------OSS文件下载成功------" + filePath);
            }
        } catch (IOException e) {
            log.error(e.getMessage(), e);
            throw e;
        } finally {
            if (os != null) {
                try {
                    os.close();
                    // 关闭OSSClient。
                    ossClient.shutdown();
                } catch (IOException e1) {
                    log.error(e1.getMessage(), e1);
                }
            }
        }
    }

4. 控制层进行请求
/**
     * 图片上传到OSS服务器上面
     *
     * @param file
     * @return
     */
    @PostMapping("/common/upload")
    @ResponseBody
    @ApiOperation(value = "图片上传")
    public R uploadFileOss(MultipartFile file) {
        // 判断文件
        if (file == null) {
            return R.error("请确认上传文件不为空!");
        }
        String filename = file.getOriginalFilename();
        try {
            //注意两种方式不能混合使用 (不能上传使用OSS 下载使用本地这样会导致图片有错误)
            if (applicationProperties.getOss().isEnabled()) {
                //进行OSS上传方式
                if (!"".equals(filename.trim())) {
                    File newFile = new File(filename);
                    // 上传到OSS
                    String uploadUrl = OssUtil.upLoad(newFile, applicationProperties);
                    R ajax = R.success();
                    ajax.put("fileName", uploadUrl);
                    return R.success(ajax);
                }
            } else {
                //进行本地上传方式
                // 上传并返回新文件名称
                // 上传文件路径
                String filePath = Global.getUploadPath();
                String fileName = FileUploadUtils.upload(filePath, file);
                R ajax = R.success();
                ajax.put("fileName", fileName);
                return ajax;
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new BadRequestAlertException("file upload fail", ENTITY_NAME, FILE_UPLOAD_FAIL);
        }
        return null;
    }


    /**
     * 通过文件名下载文件 (显示图片)
     */
    @GetMapping("/common/download")
    @ApiOperation(value = "图片预览接口, 此链接单独配置以后可能会被静态资源服务器取代")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "fileName", value = "文件名", required = true),
    })
    public void fileDownloadOss(@RequestParam(required = true) String fileName, HttpServletResponse response) {
        try {
            if (StringUtils.isEmpty(fileName)) {
                throw new BusinessException("空的文件名");
            }
            response.setCharacterEncoding(CharsetKit.UTF8);
            response.setContentType("image/jpeg");
            if (applicationProperties.getOss().isEnabled()) {
                OssUtil.writeBytes(fileName, response.getOutputStream(), applicationProperties);
            } else {
                //FileUtils.writeBytes(fileName, response.getOutputStream());
            }
        } catch (Exception e) {
            log.error("下载文件失败", e);
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

带着希望活下去

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值