项目的图片上传(java)

OSS图片上传

1. 导入依赖

        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>2.8.3</version>
        </dependency> 

2. 添加配置类

package com.sky.xiaoyuan.config;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;

import lombok.Data;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
@Data //Data的get,set用来注入properties文件
public class OSSConfig {
    // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
    private  String endpoint = "XXX";
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    private String accessKeyId = "XXX";
    private String accessKeySecret = "XXX";
    // 填写Bucket名称,例如examplebucket。
    private String bucketName = "XXX";
    //URL前缀
    private String urlPrefix = "XXX";
    @Bean
    public OSS oSSClient(){
        return new OSSClient(endpoint,accessKeyId,accessKeySecret);
    }

}


endpoint和urlPrefix 的具体位置
在这里插入图片描述
在这里插入图片描述
accesskey具体位置(个人头像)
在这里插入图片描述

使用举例

package com.sky.xiaoyuan.service;

import com.aliyun.oss.OSS;

import com.sky.xiaoyuan.config.OSSConfig;
import com.sky.xiaoyuan.vo.ImageUploadVo;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.IOException;

@Service
public class ImageUploadService {

    //自定义允许上传的文件格式
    private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg", ".jepg", ".gif", ".png"};
    //注入阿里云的OSS
    @Autowired
    private OSS ossClient;
    //注入自定义配置类
    @Autowired
    private OSSConfig ossConfig;

    /**
     * @param multipartFile 文件对象
     * @return
     */
    public ImageUploadVo upload(MultipartFile multipartFile) {
        //ImageUploadVo是 用来返回的数据类型,根据前端的需求来定义
        ImageUploadVo fileUploadResult = new ImageUploadVo();
        //先校验图片格式是否符合
        boolean isLegal = false;
        //遍历所有的自定义数组,判断其是否在自定义的格式中
        for (String type : IMAGE_TYPE) {
            if (StringUtils.endsWithIgnoreCase(multipartFile.getOriginalFilename(), type)) {
                isLegal = true;
                break;
            }
        }
        //如果该文件不在规范的格式中,就返回error
        if (!isLegal) {
            fileUploadResult.setStatus("error");
            return fileUploadResult;
        }
        //获取文件名
        String fileName = multipartFile.getOriginalFilename();
        //设置文件的存储路径,自定义的方法,来对路径进行命名
        String filePath = getFilePath(fileName);
        //上传到阿里云
        try {
            //三个参数分别为OSS的哪一个Bucket,上传到OSS中的路径,上传到OSS的文件的流式
            ossClient.putObject(ossConfig.getBucketName(), filePath, new ByteArrayInputStream(multipartFile.getBytes()));
        } catch (IOException e) {
            e.printStackTrace();
            fileUploadResult.setStatus("error");
            return fileUploadResult;
        }
        //封装返回给前端的数据
        fileUploadResult.setStatus("done");
        fileUploadResult.setName(this.ossConfig.getUrlPrefix() + filePath);
        fileUploadResult.setUid(String.valueOf(System.currentTimeMillis()));
        return fileUploadResult;
    }

    /**
     * 设置文件的路径,images/时间/...
     *
     * @param fileName
     * @return
     */
    private String getFilePath(String fileName) {
        DateTime dateTime = new DateTime();
        return "images/" + dateTime.toString("yyyy") + "/" + dateTime.toString("MM") + "/" + dateTime.toString("dd") + "/" + System.currentTimeMillis() + RandomUtils.nextInt(100, 9999) + "." + StringUtils.substringAfterLast(fileName, ".");
    }
}

本地图片上传

使用举例

package com.sky.xiaoyuan.service;

import com.sky.xiaoyuan.vo.ImageUploadVo;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Date;

@Service
public class ImageUploadLocalService {
    //自定义允许上传的文件格式
    private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg", ".jepg", ".gif", ".png"};

    public ImageUploadVo uploadVo(MultipartFile multipartFile) {
        //ImageUploadVo是 用来返回的数据类型,根据前端的需求来定义
        ImageUploadVo fileUploadResult = new ImageUploadVo();
        //先校验图片格式是否符合
        boolean isLegal = false;
        //遍历所有的自定义数组,判断其是否在自定义的格式中
        for (String type : IMAGE_TYPE) {
            if (StringUtils.endsWithIgnoreCase(multipartFile.getOriginalFilename(), type)) {
                isLegal = true;
                break;
            }
        }
        //如果该文件不在规范的格式中,就返回error
        if (!isLegal) {
            fileUploadResult.setStatus("error");
            return fileUploadResult;
        }
        //获取文件名
        String fileName = multipartFile.getOriginalFilename();
        //设置文件的存储路径,自定义的方法,来对路径进行命名
        String filePath = getFilePath(fileName);
        // 生成图片的绝对引用地址
        String picUrl = StringUtils.replace(StringUtils.substringAfter(filePath, "E:\\java\\project\\tenement\\"), "\\", "/");
        //封装返回到前端的链接。部署到nginx后可以通过该链接访问图片
        fileUploadResult.setName("http://image.xiaoyuan.com" + picUrl);
        File newFile = new File(filePath);
        // 写文件到磁盘
        try {
            multipartFile.transferTo(newFile);
        } catch (IOException e) {
            e.printStackTrace();
            //上传失败 
            fileUploadResult.setStatus("error");
            return fileUploadResult;
        }
        //封装返回前端的数据
        fileUploadResult.setStatus("done");
        fileUploadResult.setUid(String.valueOf(System.currentTimeMillis()));
        return fileUploadResult;

    }

    /**
     * 设置文件的路径,images/时间/...
     *
     * @param fileName
     * @return
     */
    private String getFilePath(String fileName) {
        String baseFolder = "E:\\java\\project\\tenement\\" + File.separator + "image";
        Date nowDate = new Date();
        //路径为时间的格式
        String fileFolder = baseFolder + File.separator + new DateTime(nowDate).toString("yyyy")
                + File.separator + new DateTime(nowDate).toString("MM") + File.separator +
                new DateTime(nowDate).toString("dd");

        File file = new File(fileFolder);
        //如果路径不存在就创建该路径
        if (!file.isDirectory()) {
            file.mkdirs();
        }
        //生成新的文件名
        String newFileName = new DateTime(nowDate).toString("yyyyMMddhhmmssSSSS") + RandomUtils.nextInt(100, 9999) + "."
                + StringUtils.substringAfterLast(fileName, ".");
        return fileFolder + File.separator + newFileName;
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值