【mac系统】springboot静态资源路径配置,保存安卓端上传的图片

先说整体思路:

  1. 安卓上传图片:在安卓端选取相册图片或拍照后,使用base64对图片进行编码,用String类型传给后端。
  2. java后台存储图片:后端对base64字符串进行解码,把图片存到电脑本地文件夹,再把图片在本地的存放路径写入到数据库。
    3.当有请求时,向安卓端返回图片地址:后端把图片路径返回给安卓端,由安卓端拼接出完整的图片链接:http://+服务器(即电脑)ip地址:8080+图片名称(示例:http://服务器ip:8080/portrait.png)

下面说具体步骤:

1. application.properties配置文件如下:

server.port=8080

web.upload-path=/Users/rabbit/Desktop/data/

spring.mvc.static-path-pattern=/**
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,\
  classpath:/static/,classpath:/public/,file:${web.upload-path}

说明(不想看的话这里可以略过,直接跳到↓验证部分):web.upload-path这个属于自定义的属性,指定了一个路径;

spring.mvc.static-path-pattern=/**表示所有的访问都经过静态资源路径,注意以/结尾;

spring.resources.static-locations在这里配置静态资源路径,前面说了这里的配置是覆盖默认配置,所以需要将默认的也加上否则staticpublic等这些路径将不能被当作静态资源路径,在这个最末尾的file:${web.upload-path}之所有要加file:是因为指定的是一个具体的硬盘路径,其他的使用classpath指的是系统环境变量

验证

这一part需要单独进行验证!没有问题才能进行下面的步骤!
因为刚刚配置的这个地址,表示图片存在你电脑上的哪个文件夹:

web.upload-path=/Users/rabbit/Desktop/data/

所以你需要在电脑上/Users/rabbit/Desktop/data的文件夹里,先存一张图片,然后运行后台java程序,再打开浏览器,输入localhost:8080/图片名称.后缀(如:localhost:8080/portrait.png),看是否能成功访问。


验证示例:在文件夹中存入portrait.png图片

验证示例:浏览器查看图片

解释:为什么直接访问http://localhost:8080/portrait.png就可以成功呢?是因为刚刚在配置文件中添加的那些话,可以把/解析成/Users/rabbit/Desktop/data/。这样一来,当你在浏览器访问localhost:8080/portrait.png,就相当于访问了localhost:8080/Users/rabbit/Desktop/data/portrait.png

如果可以在浏览器页面中看到图片,说明这一步配置没有问题,可以进行后面的操作。
如果不行.. 可以百度一下查查有没有其他配置方法,直到这一步验证成功。

2. 安卓端上传图片

  • 拿到图片路径picturePath(String类型的)

  • 将图片转换成Base64编码的字符串,以下方法可以直接复制到代码里用,传入参数picturePath,得到的返回值是图片的base64编码。

/**
     * 将图片转换成Base64编码的字符串
     *
     * @param path 图片本地路径
     * @return base64编码的字符串
     */
    public static String imageToBase64(String path) {
        if (TextUtils.isEmpty(path)) {
            return null;
        }
        InputStream is = null;
        byte[] data;
        String result = null;
        try {
            is = new FileInputStream(path);
            //创建一个字符流大小的数组。
            data = new byte[is.available()];
            //写入数组
            is.read(data);
            //用默认的编码格式进行编码
            result = Base64.encodeToString(data, Base64.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != is) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }

  • 调用网络请求,把图片的base64编码传给后端

后端把图片存在本地,并拿到图片地址

以上传头像图片为例:

//  UserService.java
// 声明图片将要存储到的本地文件夹的路径
@Value("${web.upload-path}")
    private String path;

/**
     * 保存头像到服务器
     * 该方法可以直接复制到你的代码中来用
     * @param portrait 头像的base64编码
     * @return 服务器端头像路径
     */
    @Transactional
    public String savePortrait(Integer userId, String portrait) {

        // System.out.println("开始解码");
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            //Base64解码
            byte[] b = decoder.decodeBuffer(portrait);
            // System.out.println("解码完成");
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {//调整异常数据
                    b[i] += 256;
                }
            }
            // System.out.println("开始生成图片");
            // 生成jpeg图片
            Random random = new Random();
            String realPath = "/portrait" + random.nextInt(1000) + ".jpeg";
            OutputStream out = new FileOutputStream(path + realPath);
            out.write(b);
            out.flush();
            out.close();

            // 由安卓端拼接出完整路径
            return realPath;

        } catch (Exception e) {
            System.out.println("修改失败,保存文件失败");
            return null;
        }
    }

如上图代码,方法的返回值即为服务器端的图片路径,把该返回值直接赋值给user的portrait变量,然后把user存到数据库中即可(或更新数据库中的user的值)。

安卓端获取图片链接

该方法的缺点在这里也体现出来了,即:安卓端每次拿到新的user,都需要重新手动拼接出图片的链接才可以用。同样举例如下:

// 通过网络请求,拿到更新头像图片信息后的user实体,需要处理一下头像的值
user.setPortrait("http://服务器ip:8080/" + user.getPortrait());

好了,到这里,所有步骤就结束了,快去试试能不能成功上传图片并保存吧~

附录:贴一下pom.xml,以防万一

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--spring security-->
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-jwt</artifactId>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335