JFinal上传图片到阿里云OSS

最近在用JFinal写博客,想要把图片上传到阿里云,我是很懒的,百度了下居然没有jfinal+OSS的例子,只能自己写了.....

Controller:

/**
 * 阿里云上传图片Controller
 */
public class AliOssController extends Controller {

    private static Prop p = PropKit.use("aliyun.txt");

    public void index() throws Exception {
        OSSClient ossClient = FileUtil.getOSSClient();
        UploadFile uploadFile = getFile();
        File file = new File(uploadFile.getUploadPath() + "/" + uploadFile.getOriginalFileName());
        String picUrl = FileUtil.uploadImg(ossClient, file, p.get("BACKET_NAME"), p.get("FOLDER"));
        renderJson(picUrl);
    }
}

FileUtils:

public class FileUtil {

    private static Prop p = PropKit.use("aliyun.txt");


    public static OSSClient getOSSClient() {
        return new OSSClient(p.get("ENDPOINT"), p.get("ACCESS_KEY_ID"), p.get("ACCESS_KEY_SECRET"));
    }


    public static String uploadImg(OSSClient ossClient, File file, String bucketName, String folder) {
        String url = null;
        try {
            // 以输入流的形式上传文件
            InputStream is = new FileInputStream(file);
            // 文件名
            String fileName = file.getName();
            fileName = UUID.randomUUID().toString().replaceAll("-","") + fileName;
            // 文件大小
            Long fileSize = file.length();
            // 创建上传Object的Metadata
            ObjectMetadata metadata = new ObjectMetadata();
            // 上传的文件的长度
            metadata.setContentLength(is.available());
            // 指定该Object被下载时的网页的缓存行为
            metadata.setCacheControl("no-cache");
            // 指定该Object下设置Header
            metadata.setHeader("Pragma", "no-cache");
            // 指定该Object被下载时的内容编码格式
            metadata.setContentEncoding("utf-8");
            // 文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成,
            // 如果没有扩展名则填默认值application/octet-stream
            metadata.setContentType(getContentType(fileName));
            // 指定该Object被下载时的名称(指示MINME用户代理如何显示附加的文件,打开或下载,及文件名称)
            metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");
            // 上传文件 (上传文件流的形式)
            PutObjectResult putResult = ossClient.putObject(bucketName, folder + fileName, is, metadata);
            // 解析结果
            url = "https://" + p.get("BACKET_NAME") + "." + p.get("ENDPOINT") + "/" + p.get("FOLDER") + fileName;
            System.out.println("上传的文件路径:" + url);
            return url;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("上传阿里云异常");
        }
        return url;
    }

    public static String getContentType(String fileName) {
        // 文件的后缀名
        String fileExtension = fileName.substring(fileName.lastIndexOf("."));
        if (".bmp".equalsIgnoreCase(fileExtension)) {
            return "image/bmp";
        }
        if (".gif".equalsIgnoreCase(fileExtension)) {
            return "image/gif";
        }
        if (".jpeg".equalsIgnoreCase(fileExtension) || ".jpg".equalsIgnoreCase(fileExtension)
                || ".png".equalsIgnoreCase(fileExtension)) {
            return "image/jpeg";
        }
        if (".html".equalsIgnoreCase(fileExtension)) {
            return "text/html";
        }
        if (".txt".equalsIgnoreCase(fileExtension)) {
            return "text/plain";
        }
        if (".vsd".equalsIgnoreCase(fileExtension)) {
            return "application/vnd.visio";
        }
        if (".ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) {
            return "application/vnd.ms-powerpoint";
        }
        if (".doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) {
            return "application/msword";
        }
        if (".xml".equalsIgnoreCase(fileExtension)) {
            return "text/xml";
        }
        // 默认返回类型
        return "image/jpeg";
    }

这里用到了OSS四个配置,没做过的,百度一下就知道是什么意思了

#阿里云oss配置
ENDPOINT=
ACCESS_KEY_ID=
ACCESS_KEY_SECRET=
BACKET_NAME=
FOLDER=

5.png

每天在俱乐部提问,那么多大佬帮忙解答,so...分享个例子帮助下比我还白的小白~~~

排版可能有些乱,拉到idea里格式化一下就好

欢迎更多的小伙伴加入JFinal俱乐部一起学习~~

评论区

山东小木

2018-12-15 00:40

用阿里云oss cdn做回源也行
或者前端直接上传oss 七牛 会更好 直接不走自己服务器了

过河

2018-12-15 00:45

@山东小木 确实是这样 只不过阿里云配置cdn还不是太懂 哈哈,有时间还是要修改下

张胖胖

2018-12-15 00:59

@过河 非常简单,参考一下我的系统:https://gitee.com/EpochGroup/epoch
里面包含了上传到阿里云OSS

JFinal

2018-12-15 16:32

俱乐部第一美女第一次做分享,不顶不行

杜福忠

2018-12-15 20:27

分享从点滴做起~ 热爱分享~享受分享

蔚蓝天空

2018-12-16 19:50

俱乐部第一美女第一次做分享,不顶不行

elber25977

2018-12-17 15:59

俱乐部第一美女的分享,不顶不行

邶风

2018-12-18 09:24

用switch吧,舒服点
String fileExtension = fileName.substring(fileName.lastIndexOf(".")+1);
switch (fileExtension.toLowerCase()) {
case "bmp":
return "image/bmp";
case "gif":
return "image/gif";
case "jpeg":
case "jpg":
case "png":
return "image/jpeg";
case "html":
return "text/html";
case "txt":
return "text/plain";
case "vsd":
return "application/vnd.visio";
case "ppt":
case "pptx":
return "application/vnd.ms-powerpoint";
case "doc":
case "docx":
return "application/msword";
case "xml":
return "text/xml";
default:
return "image/jpeg";
}

happyboy

2018-12-19 14:37

我是进来看头像的。^_^

suxiaoqiuking

2018-12-20 14:11

俱乐部第一美女第一次做分享,不顶不行

hinruy

2019-02-27 16:30

UploadFile uploadFile = getFile();
这个是已经把文件上传到项目内了,再从项目内上传到OSS,如果我上传较大的文件,比如1G,先上传到项目,再上传到OSS,等于上传了2G的文件,有没有其它方法

阿坤

2019-06-30 17:20

不顶不行

Mavenjay

2019-08-23 10:55

Mavenjay

2019-08-23 10:58

getFile(“file”,“upload”); 如果第二个参数给个null 就不会自动上传到项目下面就好了

JFinal

2019-08-23 11:47

@Mavenjay 你可以通过配置 me.setBaseUploadPath("/var/temp") 指令默认上传目录,将文件上传到项目之外就可以了

然后用完上传文件,通过 uf.getFile().delete() 删掉就好

Mavenjay

2019-08-23 18:12

@JFinal 上传完再删掉。虽然还是增加了一点 上传的压力。但也是一个解决办法 谢谢了

JFinal

2019-08-23 22:17

@Mavenjay 不会增加上传压力,只是需要一点存放空间,放完后即可删掉

如果放内存,仍然也是需要资源的,而且放内存更容易爆掉你的 JVM

热门分享

扫码入社