zoukankan      html  css  js  c++  java
  • 图片上传及访问

    通过spring-boot实现文件上传到服务器上,并将链接保存在数据库中

    新手操作请先看这篇: sprint-boot实现第一个api

    application.properties 部分配置

    ip=***.**.***.***
    #图片存储的位置
    image-save-path=/data/images/
    

    ImageController

    package com.example.demo.controller;
    
    import com.example.demo.model.Image;
    import com.example.demo.result.Result;
    import com.example.demo.result.ResultGenerator;
    import com.example.demo.server.ImageServer;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.File;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.UUID;
    
    @RestController
    public class ImageController {
    
        private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    
        /**
         * 图片保存路径
         */
        @Value("${image-save-path}")
        private String imageSavePath;
    
        @Value("${ip}")
        private String ip;
    
        @Value("${server.port}")
        private String port;
    
        @Autowired
        private ImageServer imageServer;
    
        @RequestMapping(value = "upload/image", method = RequestMethod.POST)
        public Result uploadImage(@RequestParam("file") MultipartFile file) {
            if (file.isEmpty()) {
                return ResultGenerator.getFailResult("图片为空");
            }
    
            //1. 后半段目录
            String directory = simpleDateFormat.format(new Date());
    
            //2.文件保存目录
            File dir = new File(imageSavePath + directory);
            if (!dir.exists()) {
                dir.mkdir();
            }
    
            //3.给文件重新设置一个名字
            String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            String newFileName = UUID.randomUUID().toString().replace("-", "") + suffix;
    
            //4.创建这个新文件
            File newFile = new File(imageSavePath + directory + "/" + newFileName);
    
            //5.复制操作
            try {
                file.transferTo(newFile);
                String url = "http://" + ip + ":" + port + "/images/" + directory + "/" + newFileName;
                Image image = new Image();
                image.setUrl(url);
                imageServer.saveUrl(image);
                return ResultGenerator.getSuccessResult(url);
            } catch (IOException e) {
                return ResultGenerator.getFailResult(newFile.exists() + " " + e.getMessage());
            }
        }
    }
    

    资源文件映射

    为什么需要这个?

    可以看到图片上传存储的实际位置是 /data/images/yyyy-MM-dd/xxx.jpg

    我们无法直接通过 url 来访问

    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
        /**
         * 图片保存路径
         */
        @Value("${image-save-path}")
        private String imageSavePath;
    
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/images/**")
                    .addResourceLocations("file://" + imageSavePath);
        }
    }
    

    资源文件配置失效解决思路

    本地 java 上传文件

    private static void postImage() {
        HttpClient httpClient = HttpClientBuilder.create().build();
        HttpPost httpPost = new HttpPost(url+"/upload/image");
        MultipartEntityBuilder meb = MultipartEntityBuilder.create();
        meb.addBinaryBody("file",new File("C:\Users\花染梦\Desktop\0.png"));
        HttpEntity httpEntity = meb.build();
        System.out.println(httpEntity);
        httpPost.setEntity(httpEntity);
        try{
            StringBuilder sb = new StringBuilder();
            String line;
            HttpResponse httpResponse = httpClient.execute(httpPost);
            InputStream is = httpResponse.getEntity().getContent();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            while((line=br.readLine())!=null){
                sb.append(line);
            }
            String msg = URLDecoder.decode(sb.toString(),"UTF-8");
            System.out.println(msg);
        }catch (IOException e){
            e.printStackTrace();
        }
    }
    

    返回的 url : http://*****/images/2021-02-10/0692064e49d14dbaaf14c2e41d99639d.png

    请特别注意:这里返回的是http,而不是 https,原因在于网站没有签发信任SSL证书的情况下,不能通过 https 访问图片

  • 相关阅读:
    SQLServer多表连接查询
    SQLServer基本查询
    SQLServer索引
    SQLServer之数据类型
    设计模式小结
    SQL跨项目查询语法
    利用CountDownLatch和Semaphore测试案例
    JUC包下Semaphore学习笔记
    JUC包下CountDownLatch学习笔记
    JUC包下CyclicBarrier学习笔记
  • 原文地址:https://www.cnblogs.com/huaranmeng/p/14396939.html
Copyright © 2011-2022 走看看