美文网首页android
【mac系统】springboot静态资源路径配置,保存安卓端上

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

作者: 澄祯 | 来源:发表于2019-05-08 16:53 被阅读0次

    先说整体思路:

    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>
    

    相关文章

      网友评论

        本文标题:【mac系统】springboot静态资源路径配置,保存安卓端上

        本文链接:https://www.haomeiwen.com/subject/zwcvoqtx.html