IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> springboot+mongodb+OSS -> 正文阅读

[大数据]springboot+mongodb+OSS

资源类存储

1、springboot+mongodb

  • 引入依赖
 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
  </dependency>
  <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
  </dependency>
  • 资源配置类
# 服务端口
server.port=8090
# mongodb地址+数据库名
spring.data.mongodb.uri=mongodb://127.0.0.1:27017/file
# 最大文件数
spring.servlet.multipart.max-file-size=10MB
# 最大请求数
spring.servlet.multipart.max-request-size=100MB

  • 文件封装类
  • UploadFile
@Data
@Document
//链式编程
@Accessors(chain = true)
public class UploadFile {

    @Id
    private String id;
    /** 文件名 */
    private String name;
    /** 上传时间 */
    private LocalDateTime createdTime;
    /** 文件内容 */
    private Binary content;
    /** 文件类型 */
    private String contentType;
    /** 文件大小 */
    private long size;
    public UploadFile(){
        this.id = UUID.randomUUID().toString().substring(0,32);
    }
}

  • 反馈结果封装类
  • JSONResult
@Data
@Accessors(chain = true)
public class JSONResult<T> implements Serializable {

    /** 状态值 */
    private Integer code;

    /** 提示信息 */
    private String msg;

    /** 数据 */
    private T data;

    public static <T> JSONResult<T> build(int code, String msg, T data) {
        return new JSONResult<T>()
                .setCode(code)
                .setMsg(msg)
                .setData(data);
    }

}
  • controller
/**
 * Created with IntelliJ IDEA.
 *
 * @Author: fl
 * @Date: 2021/10/01/9:37
 * @Description:
 */
@RestController
@RequestMapping("/db")
public class MongoDBController {

    //封装集合名
    public static String getCollection(String name){
        return "fileCollection_"+name;
    }

    @Autowired
    private MongoTemplate mongoTemplate;

    @Value("${server.port}")
    private String port;

    @PostMapping("/upload")
    public JSONResult<String> uploadImage(@RequestParam("file")MultipartFile file){
        JSONResult<String> jsonResult = null;
        try {
            //设置图片封装类基本信息
            UploadFile uploadFile = new UploadFile()
                    .setContentType(file.getContentType().split("/")[1])
                    .setName(file.getOriginalFilename())
                    .setCreatedTime(LocalDateTime.now())
                    .setContent(new Binary(file.getBytes()))
                    .setSize(file.getSize());
            //存入mongodb
            UploadFile savedFile = mongoTemplate.save(uploadFile, getCollection("photo"));
            String url = "localhost:"+ port +"/db/image/show/"+savedFile.getId()+"/photo";

            //前端展示信息
            if (file.getOriginalFilename().contains("mp4")){
                url = "localhost:"+ port +"/db/movie/show/"+savedFile.getId()+"/photo";
            }
            jsonResult = JSONResult.build(200, "图片上传成功", url);
        } catch (Exception e) {
            e.printStackTrace();
            jsonResult = JSONResult.build(500,"图片上传失败",null);
        }
        return jsonResult;
    }

    @GetMapping("/movie/show/{id}/{name}")
    public void movieLoad(@PathVariable("id") String id,
                          @PathVariable("name") String name,
                          HttpServletResponse response) throws Exception{
        UploadFile file = mongoTemplate.findById(id, UploadFile.class, getCollection(name));

        response.setContentType("video/mp4");
        OutputStream outputStream = response.getOutputStream();
        outputStream.write(file.getContent().getData());
        outputStream.flush();
    }

    //设置返回值的字符编码
    @GetMapping(value = "/image/show/{id}/{name}", produces = {MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE})
    public byte[] loadImage(@PathVariable("id") String id,
                          @PathVariable("name") String name){
        List<UploadFile> fileList = mongoTemplate.find(new Query(Criteria.where("_id").is(id)),UploadFile.class,getCollection(name));
        byte[] data = null;
        data = fileList.get(0).getContent().getData();
        return data;
    }

    /**
     * 获取图片
     * @param id
     * @param name
     * @param response
     * @throws IOException
     */
    @GetMapping(value = "/image/out/{id}/{name}")
    public void outImage(@PathVariable("id") String id,
                           @PathVariable("name") String name,
                           HttpServletResponse response) throws IOException{
        List<UploadFile> fileList = mongoTemplate.find(new Query(Criteria.where("_id").is(id)),UploadFile.class,getCollection(name));
        byte[] data = fileList.get(0).getContent().getData();
        response.setContentType("image/jpeg");
        ServletOutputStream outputStream = response.getOutputStream();
        BufferedImage image = ImageIO.read(new ByteArrayInputStream(data));
        ImageIO.write(image,"png",outputStream);
    }

    /**
     * 下载到本地
     * @param id
     * @param name
     * @return
     * @throws IOException
     */
    @GetMapping("/image/local/{id}/{name}")
    public String loadLocal(@PathVariable("id") String id,
                            @PathVariable("name") String name) throws IOException {
        //获取指定集合中指定对象
        UploadFile file = mongoTemplate.findById(id,UploadFile.class,getCollection(name));
        File file1 = new File("D:\\temp\\movies\\"+file.getName());
        if (file1.exists()){
            file1.delete();
        }
        file1.createNewFile();
        OutputStream outputStream = new FileOutputStream(file1);
        outputStream.write(file.getContent().getData());
        return "ok";
    }
}
  • 前端html
  • 资源上传
<!DOCTYPE html>
<html>
<head>
    <title>db</title>
</head>
<body>
<div>
    <form method="post" enctype="multipart/form-data" action="/db/upload">
        <table>
            <tr>
                <td>File to upload:</td>
                <td><input type="file" name="file"/></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="Upload"/></td>
            </tr>
        </table>
    </form>
</div>
</body>
</html>
  • 展示视频
<!DOCTYPE html>
<html>
<head>
    <title>视频展示</title>
</head>
<body>

<div>
    <video width="1120" height="540" controls="controls" id="video" preload="auto">
<!--        src是调用后台查询视频的接口-->
        <source src="/db/movie/show/d0f1c295-e8f5-485d-b594-5e2a07a8/photo" type="video/mp4">
    </video>
</div>
</body>
</html>

2、springboot+OSS(阿里OSS对象存储)

  • 引入依赖
 <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.10.2</version>
  </dependency>
  • 文件封装类
  • LoadFile
@Data
@Document
@Accessors(chain = true)
public class LoadFile {

    @Id
    private String id;

    private String filePath;
    /** 文件名 */
    private String name;
    /** 上传时间 */
    private LocalDateTime createdTime;
    /** 文件内容 */
    private InputStream content;
    /** 文件类型 */
    private String contentType;
    /** 文件大小 */
    private long size;
}

  • 封装基本写和读
  • Aliyun

@Component
public class Aliyun {

    @Autowired
    private RestTemplate restTemplate;

    /// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-beijing.aliyuncs.com。
    private static String endpoint = "https://oss-cn-beijing.aliyuncs.com";

    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    //从阿里控制台点击头像可以看到AccessKey
    private static String accessKeyId = "******";

    private static String accessKeySecret = "******";

    private static String bucketName = "******";

    public String upload(LoadFile file, String url) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        String key = file.getFilePath() + "/" + file.getName();

        // 创建PutObjectRequest对象。
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, file.getContent());
        //上传到oss后就在本地下载
        //只是测试---------
        String result = restTemplate.getForObject(url, String.class, file.getName(), file.getFilePath());
        //-----测试--------

        // 上传字符串。
        ossClient.putObject(putObjectRequest);

        // 关闭OSSClient。
        ossClient.shutdown();
        return result;
    }

    //能读但是没办法显示。。
    public byte[] load(String key) throws IOException {

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
        OSSObject ossObject = ossClient.getObject(bucketName, key);
        BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
        StringBuffer buffer = new StringBuffer();
        while (true) {
            String line = reader.readLine();
            buffer.append(line);
            if (line == null) {
                break;
            }
        }
        byte[] data = buffer.toString().getBytes(Charset.defaultCharset());
        reader.close();
        // 关闭OSSClient。
        ossClient.shutdown();
        return data;
    }

    public void loadLocal(String key) throws IOException {

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。
        File file = new File("D:\\temp\\" + key);
        if (file.exists()) {
            file.delete();
        }
        file.createNewFile();
        ossClient.getObject(new GetObjectRequest(bucketName, key), file);
        // 关闭OSSClient。
        ossClient.shutdown();
    }

}

  • controller

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: fl
 * @Date: 2021/10/01/13:08
 * @Description:
 */
@RestController
@RequestMapping("/oss")
public class OSSController {

    @Autowired
    Aliyun aliyun;
    @Autowired
    RestTemplate restTemplate;

    @PostMapping("/image/upload")
    public JSONResult<String> upload(@RequestParam("file")MultipartFile file) throws Exception{
        LoadFile loadFile = new LoadFile()
                .setFilePath("movie")
                .setName(file.getOriginalFilename())
                .setContent(file.getInputStream());
        String url = "http://localhost:8090/oss/load/"+file.getOriginalFilename()+"/"+loadFile.getFilePath();
        String result = aliyun.upload(loadFile, url);
        JSONResult<String> jsonResult = JSONResult.build(200, result,url);
        return jsonResult;
    }

    @GetMapping(value = "/load/{name}/{path}")
    public String load(@PathVariable("name")String name,
                     @PathVariable("path")String path) throws Exception{
        aliyun.loadLocal(path + "/" + name);
        return "生成文件已经下载直本地D:/temp"+path+"/"+name;
    }
}

  • 可能restTemplat会出错
  • RestTemplateConfig
@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        return builder.build();
    }

}
  • 前端页面
<!DOCTYPE html>
<html>
<head>
    <title>oss</title>
</head>
<body>

<div>
    <form method="post" enctype="multipart/form-data" action="/oss/image/upload">
        <table>
            <tr>
                <td>File to upload:</td>
                <td><input type="file" name="file"/></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="Upload"/></td>
            </tr>
        </table>
    </form>
</div>

</body>
</html>

  • 附上一个地址跳转controller
@Controller
public class RouteController {

    @GetMapping("/image")
    public String uploadImage(){return "imageUpload";}

    @GetMapping("movie")
    public String uploadMovie(){return "movies";}

    @GetMapping("/oss/image")
    public String uploadOSSImage(){return "ossUpload";}

    @GetMapping("/oss/movie")
    public String uploadOSSMovie(){return "OOSMovies";}
}
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-02 14:56:26  更:2021-10-02 14:58:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:25:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码