Spring Mvc 文件上传-下载

Spring Mvc 文件上传-下载

1、导入依赖

<!--        文件上传的jar依赖-->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>1.4</version>
</dependency>

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.2.2</version>
</dependency>

2、在sprig-mvc.mxl文件中定义,文件上传解析器

 <!--    配置文件上传-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="defaultEncoding" value="utf-8"/> <!-- 指定文件上传的默认编码 -->
    <property name="maxInMemorySize" value="2097152"/> <!--占用内存最大值-->
    <property name="maxUploadSize" value="52428800"/><!--最大文件上传大小-->
</bean>

3、定义表单,并跳转到controller,指定文件上传的方法上

<form action="pages/insert" method= "post" enctype= "multipart/form-data">
     消息类型: <input type="text" id= "title" name= "title" value=""/>
     上传照片: <input type= "file" id= "pic" name= "pic"/><br>
     <input type="submit" value="提交">
     <input type="reset" value="重 置"><
</form>

4、方式一:在controller控制器中,需要在文件上传的方法中使用这个接口,MultipartFile;此接口为CommonsMultipartFile类的父类

@RequestMapping("方法的访问路径")     //当表单跳根据路径跳转到此方法时MultipartFile对象将接收文件数据,
public ModelAndView insert (Type type, MultipartFile pic) {
	System. out. println(" [类型名称] " + type.getTitle());
	System. out . println(" [文件类型] " + pic. getContentType()) ;
	System. out. println(" [文件大小]"+ pic.getSize());
	System. out . println(" [是否为空] " + pic. isEmpty());
	System. out . println(" [数据流]"+ pic. getInputStream());
    System. out . println(" [文件全名(包含后缀)]"+ pic. getOriginalFilename());
    //指定上传路径 
	File file = new File("D:/upload/"); 
	// 遍历uploadfiles数组,取出单个文件对象,并上传
    for (MultipartFile multipartFile : uploadfiles) { 
        //指定上传后的文件的全名称 
        String newFileName = UUID.randomUUID() + multipartFile.getOriginalFilename();
        //文件上传:将文件放到指定的路径下
        multipartFile.transferTo(new File(file, newFileName)); 
    }
		return null;     //返回null表示不跳转
}

在使用外置的tomcat时,可以利用HttpServletRequest对象获取项目运行部署路径下的upload文件夹路径。

//注意:SpringBoot 不适用此方法获取项目部署路径,因为SpringBoot集成了tomcat,不是使用的本地的tomcat
String realPath = req.getSession().getServletContext().getRealPath("/upload");

CommonsMultipartFile常用方法

org. springframework web.multipart.commons. CommonsMultipartFile

// a.	取得上传文件的MIME类型:	 	
		public String getContentType();
// b.	判断是否有上传文件:				
		public boolean isEmpty();// c.	取得上传文件的长度:				
		public long getSize();// d.	取得上传文件的输入流:			
		public InputStream getInputream()
// e.	取得上传文件的全名称:         
		public String getOriginalFilename()

5、方式二:使用HttpServletRequest上传文件

//        文件上传,并返回上传后的图片路径,根据HttpServletRequest,删除文件
    public String getFileUploadName(HttpServletRequest req) {
//        获取项目运行部署路径下的upload文件夹路径
        String realPath = req.getSession().getServletContext().getRealPath("/upload");
        MultipartHttpServletRequest mf = (MultipartHttpServletRequest) req;
//        根据《input type=”file” id=”file”》,《input type=”file” id=”file2”》,《input type=”file” id=”file3”》id获取文件对象
        CommonsMultipartFile file1 = (CommonsMultipartFile) mf.getFile("file");
        CommonsMultipartFile file2 = (CommonsMultipartFile) mf.getFile("file2");
        CommonsMultipartFile file3 = (CommonsMultipartFile) mf.getFile("file3");
//        随机生成文件名
        String filename1 = UUID.randomUUID().toString().replaceAll("-", "") +
                file1.getOriginalFilename().substring(file1.getOriginalFilename().lastIndexOf(
                        "."));
        String filename2 = UUID.randomUUID().toString().replaceAll("-", "") +
                file2.getOriginalFilename().substring(file2.getOriginalFilename().lastIndexOf(
                        "."));
        String filename3 = UUID.randomUUID().toString().replaceAll("-", "") +
                file3.getOriginalFilename().substring(file3.getOriginalFilename().lastIndexOf(
                        "."));
//        在upload文件下创建当天日期的文件夹
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String ds = format.format(date);
        File realDir = new File(realPath + "/" + ds);
//        如果没有这个文件夹,则创建文件夹
        if (!realDir.exists()) {
            realDir.mkdirs();
        }
//        指定图片存放的路径
        String path1 = realPath + "/" + ds + "/" + filename1;
        String path2 = realPath + "/" + ds + "/" + filename2;
        String path3 = realPath + "/" + ds + "/" + filename3;
//        创建文件夹,并将图片上传到指定路径
        File f1 = new File(path1);
        try {
            FileUtils.copyInputStreamToFile(file1.getInputStream(), f1);
        } catch (IOException e) {
            e.printStackTrace();
        }
        File f2 = new File(path2);
        try {
            FileUtils.copyInputStreamToFile(file2.getInputStream(), f2);
        } catch (IOException e) {
            e.printStackTrace();
        }
        File f3 = new File(path3);
        try {
            FileUtils.copyInputStreamToFile(file3.getInputStream(), f3);
        } catch (IOException e) {
            e.printStackTrace();
        }
//        将上传的三个图片用逗号分隔,组合成字符串
        String mimg = ds + "/" + filename1 + "," + ds + "/" + filename2 + "," + ds + "/" +
                filename3;
        return mimg;
    }

6、文件下载

    @Value("${img.rootpath}")		// 获取配置文件中定义的文件保存路径
    private String rootPath;
    
    /*根据请求字符串中携带的文件名.后缀,以及在properties文件中定义的img.rootpath 指定的文件下载路径,将指定的文件输出到浏览器中
    (默认这个操作是下载操作,浏览器会自动下载到本地,如果文件流输出的目标为img标签或者其他的图片载体标签的话,则会直接在页面上面进行显示)*/
    @RequestMapping("image/**")   //  假设发出的请求为 http://localhost:8088/image/oasys.jpg
    public void image(HttpServletResponse response, HttpServletRequest request) throws Exception {
        /*获取请求中的,请求字符串携带的信息(/image/文件名.后缀) 、 获取到的是 “/image/oasys.jpg”    */
        String startpath = new String(URLDecoder.decode(request.getRequestURI(), "utf-8"));
        /*截取文件名.后缀,将startpath中多余的内容变为空格、		 获取到的是“/oasys.jpg” */
        String path = startpath.replace("/image", "");
        /*rootPath:图片保存的文件夹路径,path:文件名.后缀  */
        File f = new File(rootPath, path);
        /*获取输出流对象*/
        ServletOutputStream sos = response.getOutputStream();
        /*将文件放入到输出流中,准备输出到指定位置*/
        FileInputStream input = new FileInputStream(f.getPath());
        /*返回指定文件的byte字节长度。*/
        byte[] data = new byte[(int) f.length()];
        /* 将输出流,与文件长度放入,这个方法会读取指定长度的流,并输出,如果读取的长度不够,就会抛出异常 */
        IOUtils.readFully(input, data);
        // 将文件流输出到浏览器
        IOUtils.write(data, sos);
        input.close();
        sos.close();
    }

文件上传注意事项

上传文件时如何获取文件上传的目的地路?为什么需要这个路径?

public String getFileUploadName(HttpServletRequest req) {
        String realPath =
                req.getSession().getServletContext().getRealPath("/upload");
        }
/**为什么获取这个路径
    因为,这个获取的是项目的运行的部署路径,如果指定一个固定的地址,项目在另外了一个地方进行部署后,则不能进行获取图片的路径了**/

注意:springboot不能使用上述方法,获取项目的运行部署路径,因为springboot是内嵌式tomcat,每次启动tomcat的部署路径都不同,此方法只适用于外置的tomcat。

上传时为什么要生成一个随机文件名?如何生成?

  1. 如果不生成随机的文件名,在上传文件时可以上传同名文件,这样会导致其他的文件被覆盖
  2. 使用java中UUID.randomUUID()方法获取16字符串的随机字符串
    System.currentTimeMillis() 获取系统当前时间的毫秒数

图片上传到本地服务器中,有什么缺点?

  1. 只能在本地服务器中使用,其他服务器不能进行访问
  2. 如果本地服务器出现了故障,则会导致数据的丢失,造成严重的后果

OSS对象存储

在这里插入图片描述签名后直传在这里插入图片描述

在这里插入图片描述

导入依赖

<!--       OSS文件系统-->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.10.2</version>
</dependency>

<!-- 下面的两个依赖可能和springboot的日志依赖有冲突,选用 -->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.3</version>
</dependency>


<dependency>
    <groupId>com.aliyun.oas</groupId>
    <artifactId>aliyun-oas</artifactId>
    <version>0.2.5</version>
</dependency>

<!--     文件上传jar包 -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>1.4</version>
</dependency>

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.2.2</version>
</dependency>

OSS工具类

普通上传工具类

基础oss工具类

package gmail.zxm.dubboz1jdglweb.oss;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.CreateBucketRequest;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 阿里云oss连接工具类
 */
public class OSSUtil {
    private static String ENDPOINT = "oss-cn-beijing.aliyuncs.com";     // 外网访问连接地址
    private static String ACCESSKEY_ID = "LTAI4G1wZYN8j4mEFxHH63x9";     // ACCESSKEY ID
    private static String ACCESSKEY_SECRET = "bUqAG9FWXHyNXPP5JjS3QxWrTJ8Bg1";   // ACCESSKEY 密码
    private static String BUKET_NAME = "youzxm123";     // 仓库名称
    private static String SUFFER_URL = "http://youzxm.oss-cn-beijing.aliyuncs.com/"; // 上传成功图片访问url的前缀, http://仓库名.外网连接地址
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_ss"); // 日期格式化

    /**
     * 创建oss连接
     *
     * @return 返回连接对象
     */
    private static OSS getOssClient() throws Exception {
        OSS oss = new OSSClientBuilder().build(ENDPOINT, ACCESSKEY_ID, ACCESSKEY_SECRET);
        if (oss.doesBucketExist(BUKET_NAME)) {
            System.out.println("连接成功");
        } else {
            System.out.println("bucket不存在,创建bucket仓库");
            CreateBucketRequest createBucketRequest = new CreateBucketRequest(null); // 创建bucket仓库请求
            createBucketRequest.setBucketName(BUKET_NAME);     // 设置仓库的名称
            createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead); // 设置仓库的权限为公共读
            oss.createBucket(createBucketRequest);      // 创建仓库
        }
        return oss;
    }

    /**
     * 上传指定的文件
     * @param file     文件
     * @param fileType 文件类型
     * @return 返回访问的url地址
     */
    public static String uploadDocument(MultipartFile file, String fileType){
        OSS oss = null;
        //      上传成功后,访问的url:url前缀 + 文件名  进行访问
        String url = null;
        try {
            //      获取oss连接
             oss = getOssClient();
//      获取上传文件的后缀名
//        String ext = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));

//      判断文件类型是否为null为null的话,则赋值为default
            if (fileType == null) {
                fileType = "default";
            }
//      拼接文件名称
            String fileName = "images/" + sdf.format(new Date()) + "_" + fileType + "_" + file.getOriginalFilename();
//          文件上传
            oss.putObject(BUKET_NAME, fileName, new ByteArrayInputStream(file.getBytes()));
//          拼接返回图片的url
            url = SUFFER_URL + fileName;
            System.out.println("图片访问地址:" + url);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
//          关闭连接
            if (oss != null)
                oss.shutdown();
        }
//      返回url
        return url;
    }

    /**
     * 删除指定库中的指定文件
     * @param imgName
     * @throws Exception
     */
    public static boolean deleteDocument(String imgName) {
        OSS oss = null;
        try {
            oss = getOssClient();
            oss.deleteObject(BUKET_NAME, imgName);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (oss != null)
                oss.shutdown();
        }
        return true;
    }

    /**
     * 根据文件名删除指定文件,并上传指定的文件
     * @param file 新文件
     * @param fileType 新文件的类型
     * @param imgName 旧文件名
     * @return
     */
    public static String updateDocument(MultipartFile file , String fileType,String imgName){
        OSS oss = null;
        String url = null;
        try {
//            获取连接对象
            oss = getOssClient();
//            根据文件名删除文件对象
            oss.deleteObject(BUKET_NAME,imgName);
//            判断是否为null,为null则设置默认值
            if (fileType == null)
                fileType = "default";
//            判断文件是否为null,不为null,添加新文件
            if (!file.isEmpty()){
                String fileName = "images/" + sdf.format(new Date()) + "_" + fileType + "_" + file.getOriginalFilename();
                oss.putObject(BUKET_NAME,fileName, new ByteArrayInputStream(file.getBytes()));
                //          拼接返回图片的url
                url = SUFFER_URL + fileName;
                System.out.println("图片访问地址:" + url);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
//            判断连接对象是否为null,不为null,关闭连接
            if (oss != null)
                oss.shutdown();
        }
//        返回访问的url地址
        return url;
    }
}

功能比较齐全的oss工具类

package cn.mldn.lxh.xmz.common.oss;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.internal.OSSHeaders;
import com.aliyun.oss.model.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * oss对象存储上传工具类
 */
public class AliyunOssUtils {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
    private String folder;
    private String webUrl;


    public FileResult upload(File file) {

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

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

        String suffix = file.getName().substring(file.getName().lastIndexOf(".") + 1);

        PutObjectResult result = null;
        try {
            //容器不存在,就创建
            /*if(!ossClient.doesBucketExist(bucketName)){
                ossClient.createBucket(bucketName);
                CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
                createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
                ossClient.createBucket(createBucketRequest);
            }*/
            //khkhwkhkhk12h3k1h3k13k1h3k1h-abc.jpg
            //创建文件路径
            String fileUrl =
                    folder + "/" + (dateStr + "/" + UUID.randomUUID().toString().replace("-", "") + "-" + file.getName());


            result = uploadFileOSS(file, fileUrl);
            if (null != result) {

                FileResult fileResult = new FileResult(
                        file.length(),//文件大小
                        fileUrl,//文件的绝对路径
                        webUrl + "/" + fileUrl,//文件的web访问地址
                        suffix,//文件后缀
                        bucketName,//存储的bucket
                        file.getName(),//原文件名
                        folder//存储的文件夹
                );
                return fileResult;
            }
        } catch (OSSException oe) {
            oe.printStackTrace();
        } catch (ClientException ce) {
            ce.printStackTrace();
        } finally {
            //关闭
            // ossClient.shutdown();
        }
        return null;
    }

    public String getcontentType(String FilenameExtension) {
        if (FilenameExtension.equalsIgnoreCase(".bmp")) {
            return "image/bmp";
        }
        if (FilenameExtension.equalsIgnoreCase(".gif")) {
            return "image/gif";
        }
        if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
                FilenameExtension.equalsIgnoreCase(".jpg") ||
                FilenameExtension.equalsIgnoreCase(".png")) {
            return "image/jpeg";
        }
        if (FilenameExtension.equalsIgnoreCase(".html")) {
            return "text/html";
        }
        if (FilenameExtension.equalsIgnoreCase(".txt")) {
            return "text/plain";
        }
        if (FilenameExtension.equalsIgnoreCase(".vsd")) {
            return "application/vnd.visio";
        }
        if (FilenameExtension.equalsIgnoreCase(".pptx") ||
                FilenameExtension.equalsIgnoreCase(".ppt")) {
            return "application/vnd.ms-powerpoint";
        }
        if (FilenameExtension.equalsIgnoreCase(".docx") ||
                FilenameExtension.equalsIgnoreCase(".doc")) {
            return "application/msword";
        }
        if (FilenameExtension.equalsIgnoreCase(".xml")) {
            return "text/xml";
        }
        return "image/jpeg";
    }

    /**
     * 上传图片
     *
     * @param file
     * @return
     */
    public FileResult upload(MultipartFile file) {

        FileResult fileResult = null;

        if (file.getSize() > 1024 * 1024 * 20) {
            //return "图片太大";//RestResultGenerator.createErrorResult(ResponseEnum.PHOTO_TOO_MAX);
        }

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

        String originalFilename = file.getOriginalFilename();
        String suffix = file.getName().substring(file.getName().lastIndexOf(".") + 1).toLowerCase();

        //创建文件路径
        String fileUrl = folder + "/" + (dateStr + "/" + UUID.randomUUID().toString().replace("-", "") +
                "-" + originalFilename);
        PutObjectResult result = null;
        try {
            result = uploadFileOSS(file.getInputStream(), fileUrl);
            if (result != null) {
                fileResult = new FileResult(
                        file.getSize(),//文件大小
                        fileUrl,//文件的绝对路径
                        webUrl + "/" + fileUrl,//文件的web访问地址
                        suffix,//文件后缀
                        bucketName,//存储的bucket
                        file.getName(),//原文件名
                        folder//存储的文件夹
                );
                fileResult.setResult(result);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return fileResult;
    }


    /**
     * 上传图片
     *
     * @param files
     * @return
     */
    public FileResult upload(List<MultipartFile> files) {

        String imgsPath = "";
        String imgsWebUrl = "";

        FileResult fileResult = null;
        if (files != null && files.size() > 0) {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            String dateStr = format.format(new Date());

            fileResult = new FileResult(
                    null,//文件大小
                    null,//文件的绝对路径
                    null,//文件的web访问地址
                    null,//文件后缀
                    bucketName,//存储的bucket
                    null,//原文件名
                    folder//存储的文件夹
            );

            for (int i = 0; i < files.size(); i++) {
                MultipartFile file = files.get(i);
                String originalFilename = file.getOriginalFilename();
                String suffix = file.getName().substring(file.getName().lastIndexOf(".") + 1).toLowerCase();

                //创建文件路径
                String fileUrl = folder + "/" + (dateStr + "/" + UUID.randomUUID().toString().replace("-",
                        "") + "-" + originalFilename);
                PutObjectResult result = null;
                try {
                    result = uploadFileOSS(file.getInputStream(), fileUrl);
                    if (result != null) {
                        imgsPath += (i == 0 ? "" : ",") + fileUrl;
                        imgsWebUrl += (i == 0 ? "" : ",") + webUrl + "/" + fileUrl;

                    }

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

            fileResult.setFileAPUrl(imgsPath);
            fileResult.setWebUrl(imgsWebUrl);
        }

        return fileResult;

    }

    /**
     * 上传图片获取fileUrl
     *
     * @param instream
     * @param fileName
     * @return
     */
    private PutObjectResult uploadFileOSS(InputStream instream, String fileName) {

        PutObjectResult result = null;
        try {
            // 如果需要上传时设置存储类型与访问权限,请参考以下示例代码。
            ObjectMetadata objectMetadata = new ObjectMetadata();
            objectMetadata.setContentLength(instream.available());
            objectMetadata.setCacheControl("no-cache");
            objectMetadata.setHeader("Pragma", "no-cache");
            objectMetadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            objectMetadata.setObjectAcl(CannedAccessControlList.PublicRead);
            objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
            objectMetadata.setContentDisposition("inline;filename=" + fileName.substring(fileName.lastIndexOf("/") + 1));
            //上传文件
            //设置权限 这里是公开读
            //ossClient.setBucketAcl(bucketName,CannedAccessControlList.PublicRead);
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, instream,
                    objectMetadata);

            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            // 上传文件
            result = ossClient.putObject(putObjectRequest);


        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (instream != null) {
                    instream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            /*if(ossClient != null){
                ossClient.shutdown();
            }*/
        }

        return result;
    }

    /**
     * 上传图片获取fileUrl
     *
     * @param file
     * @param fileName
     * @return
     */
    private PutObjectResult uploadFileOSS(File file, String fileName) {


        PutObjectResult result = null;
        try {
            // 如果需要上传时设置存储类型与访问权限,请参考以下示例代码。
            ObjectMetadata objectMetadata = new ObjectMetadata();
            objectMetadata.setContentLength(file.length());
            objectMetadata.setCacheControl("no-cache");
            objectMetadata.setHeader("Pragma", "no-cache");
            objectMetadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            objectMetadata.setObjectAcl(CannedAccessControlList.PublicRead);
            objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
            objectMetadata.setContentDisposition("inline;filename=" + fileName.substring(fileName.lastIndexOf("/") + 1));
            //上传文件

            //设置权限 这里是公开读
            //ossClient.setBucketAcl(bucketName,CannedAccessControlList.PublicRead);
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, file,
                    objectMetadata);

            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            // 上传文件。
            result = ossClient.putObject(putObjectRequest);


        } catch (Exception e) {
            e.printStackTrace();
        } finally {

            /*if(ossClient != null){
                ossClient.shutdown();
            }*/
        }

        return result;
    }


    public void setEndpoint(String endpoint) {
        this.endpoint = endpoint;
    }

    public void setAccessKeyId(String accessKeyId) {
        this.accessKeyId = accessKeyId;
    }

    public void setAccessKeySecret(String accessKeySecret) {
        this.accessKeySecret = accessKeySecret;
    }

    public void setBucketName(String bucketName) {
        this.bucketName = bucketName;
    }

    public void setFolder(String folder) {
        this.folder = folder;
    }

    public void setWebUrl(String webUrl) {
        this.webUrl = webUrl;
    }
}

oss对象存储响应工具类

package cn.mldn.lxh.xmz.common.oss;

import com.aliyun.oss.model.PutObjectResult;

/**
 * oss对象存储响应工具类
 */
public class FileResult implements java.io.Serializable {


    /**
     * 文件大小
     */
    private Long fileSize;
    /**
     * 文件的绝对路径
     */
    private String fileAPUrl;

    /**
     * 文件的web访问地址
     */
    private String webUrl;

    /**
     * 文件后缀
     */
    private String fileSuffix;
    /**
     * 存储的bucket
     */
    private String fileBucket;

    /**
     * 原文件名
     */
    private String oldFileName;
    /**
     * 存储的文件夹
     */
    private String folder;

    /*
    上传文件后oss的响应对象
     */
    PutObjectResult result;


    public FileResult(Long fileSize, String fileAPUrl, String webUrl, String fileSuffix, String fileBucket,
                      String oldFileName, String folder) {
        this.fileSize = fileSize;
        this.fileAPUrl = fileAPUrl;
        this.webUrl = webUrl;
        this.fileSuffix = fileSuffix;
        this.fileBucket = fileBucket;
        this.oldFileName = oldFileName;
        this.folder = folder;
    }

    public FileResult() {

    }

    public Long getFileSize() {
        return fileSize;
    }

    public void setFileSize(Long fileSize) {
        this.fileSize = fileSize;
    }

    public String getFileAPUrl() {
        return fileAPUrl;
    }

    public void setFileAPUrl(String fileAPUrl) {
        this.fileAPUrl = fileAPUrl;
    }

    public String getWebUrl() {
        return webUrl;
    }

    public void setWebUrl(String webUrl) {
        this.webUrl = webUrl;
    }

    public String getFileSuffix() {
        return fileSuffix;
    }

    public void setFileSuffix(String fileSuffix) {
        this.fileSuffix = fileSuffix;
    }

    public String getFileBucket() {
        return fileBucket;
    }

    public void setFileBucket(String fileBucket) {
        this.fileBucket = fileBucket;
    }

    public String getOldFileName() {
        return oldFileName;
    }

    public void setOldFileName(String oldFileName) {
        this.oldFileName = oldFileName;
    }

    public String getFolder() {
        return folder;
    }

    public void setFolder(String folder) {
        this.folder = folder;
    }

    public PutObjectResult getResult() {
        return result;
    }

    public void setResult(PutObjectResult result) {
        this.result = result;
    }
}

自己写的工具类,定义了一些基本操作,可以选择不用

package gmail.zxm.dubboz1jdglweb.oss;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.CreateBucketRequest;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 阿里云oss连接工具类
 */
public class OSSUtil {
    private static String ENDPOINT = "oss-cn-beijing.aliyuncs.com";     // 外网访问连接地址
    private static String ACCESSKEY_ID = "LTAI4G1wZYN8j4mEFxHH63x9";     // ACCESSKEY ID
    private static String ACCESSKEY_SECRET = "bUqAG9FWXHyNXPP5JjS3QxWrTJ8Bg1";   // ACCESSKEY 密码
    private static String BUKET_NAME = "youzxm";     // 仓库名称
    private static String SUFFER_URL = "http://youzxm.oss-cn-beijing.aliyuncs.com/"; // 上传成功图片访问url的前缀, http://仓库名.外网连接地址
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_ss"); // 日期格式化

    /**
     * 创建oss连接
     *
     * @return 返回连接对象
     */
    private static OSS getOssClient() throws Exception {
        OSS oss = new OSSClientBuilder().build(ENDPOINT, ACCESSKEY_ID, ACCESSKEY_SECRET);
        if (oss.doesBucketExist(BUKET_NAME)) {
            System.out.println("连接成功");
        } else {
            System.out.println("bucket不存在,创建bucket仓库");
            CreateBucketRequest createBucketRequest = new CreateBucketRequest(null); // 创建bucket仓库请求
            createBucketRequest.setBucketName(BUKET_NAME);     // 设置仓库的名称
            createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead); // 设置仓库的权限为公共读
            oss.createBucket(createBucketRequest);      // 创建仓库
        }
        return oss;
    }

    /**
     * 上传指定的文件
     * @param file     文件
     * @param fileType 文件类型
     * @return 返回访问的url地址
     */
    public static String uploadDocument(MultipartFile file, String fileType){
        OSS oss = null;
        //      上传成功后,访问的url:url前缀 + 文件名  进行访问
        String url = null;
        try {
            //      获取oss连接
             oss = getOssClient();
//      获取上传文件的后缀名
//        String ext = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));

//      判断文件类型是否为null为null的话,则赋值为default
            if (fileType == null) {
                fileType = "default";
            }
//      拼接文件名称
            String fileName = "images/" + sdf.format(new Date()) + "_" + fileType + "_" + file.getOriginalFilename();
//          文件上传
            oss.putObject(BUKET_NAME, fileName, new ByteArrayInputStream(file.getBytes()));
//          拼接返回图片的url
            url = SUFFER_URL + fileName;
            System.out.println("图片访问地址:" + url);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
//          关闭连接
            if (oss != null)
                oss.shutdown();
        }
//      返回url
        return url;
    }

    /**
     * 删除指定库中的指定文件
     * @param imgName
     * @throws Exception
     */
    public static boolean deleteDocument(String imgName) {
        OSS oss = null;
        try {
            oss = getOssClient();
            oss.deleteObject(BUKET_NAME, imgName);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (oss != null)
                oss.shutdown();
        }
        return true;
    }

    /**
     * 根据文件名删除指定文件,并上传指定的文件
     * @param file 新文件
     * @param fileType 新文件的类型
     * @param imgName 旧文件名
     * @return
     */
    public static String updateDocument(MultipartFile file , String fileType,String imgName){
        OSS oss = null;
        String url = null;
        try {
//            获取连接对象
            oss = getOssClient();
//            根据文件名删除文件对象
            oss.deleteObject(BUKET_NAME,imgName);
//            判断是否为null,为null则设置默认值
            if (fileType == null)
                fileType = "default";
//            判断文件是否为null,不为null,添加新文件
            if (!file.isEmpty()){
                String fileName = "images/" + sdf.format(new Date()) + "_" + fileType + "_" + file.getOriginalFilename();
                oss.putObject(BUKET_NAME,fileName, new ByteArrayInputStream(file.getBytes()));
                //          拼接返回图片的url
                url = SUFFER_URL + fileName;
                System.out.println("图片访问地址:" + url);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
//            判断连接对象是否为null,不为null,关闭连接
            if (oss != null)
                oss.shutdown();
        }
//        返回访问的url地址
        return url;
    }
}

服务端签名上传

采用JavaScript客户端直接签名(参见JavaScript客户端签名直传)时,AccessKey ID和AcessKey Secret会暴露在前端页面,因此存在严重的安全隐患。因此,OSS提供了服务端签名后直传的方案。

服务端签名上传请转到这

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值