文档章节

实战项目-学成在线(七)

lianbang_W
 lianbang_W
发布于 10/21 11:40
字数 1455
阅读 13
收藏 0

上传图片功能实现

在此之前,必须先了解FastDFS分布式文件系统,可以看之前的文章

文件服务系统实现对文件的上传、删除、查询等功能,各子系统不再开发上传文件等请求,各子系统通过文件系统服务进行文件等上传,删除等操作。文件系统服务最终会将文件存储到fastDFS文件系统中。

执行流程:

1、管理员进入教学管理前端,点击上传图片

2、图片上传至文件系统服务,文件系统请求FastDFS上传文件

3、文件系统将文件入库,存储到文件系统服务数据库中

4、文件系统服务向前端返回文件上传结果,如果成功则包括文件到URl路径

5、课程管理前端请求课程管理进行保存课程图片信息到课程数据库

6、课程管理服务将课程图片保存到课程数据库

 

一、创建项目:xc-service-base-filesystem

添加依赖

<?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">
    <parent>
        <artifactId>xc-framework-parent</artifactId>
        <groupId>com.xuecheng</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../xc-framework-parent/pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>xc-service-base-filesystem</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.xuecheng</groupId>
            <artifactId>xc-service-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.xuecheng</groupId>
            <artifactId>xc-framework-model</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.xuecheng</groupId>
            <artifactId>xc-framework-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>net.oschina.zcx7878</groupId>
            <artifactId>fastdfs-client-java</artifactId>
        </dependency>

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

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

</project>

配置工程

server:
  port: 22100
spring:
  application:
    name: xc-service-base-filesystem
#mongo配置
  data:
    mongodb:
      database: xc_fs
      uri: mongodb://root:123@127.0.0.1:27017
#SpringMVC上传文件配置
  servlet:
    multipart:
      #默认支持文件上传.
      enabled: true
      #支持文件写入磁盘.
      file-size-threshold: 0
      # 上传文件的临时目录
      location:
      # 最大支持文件大小
      max-file-size: 1MB
      # 最大支持请求大小
      max-request-size: 30MB
xuecheng:
  fastdfs:
    connect_timeout_in_seconds: 5
    network_timeout_in_seconds: 30
    charset: UTF-8
    tracker_servers: 192.168.101.65:22122 #多个 trackerServer中间以逗号分隔

二、定义模型

package com.xuecheng.framework.domain.filesystem;

import lombok.Data;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.Map;

/**
 * Created by mrt on 2018/2/5.
 */
@Data
@ToString
@Document(collection = "filesystem")
public class FileSystem {

    @Id
    private String fileId;
    //文件请求路径
    private String filePath;
    //文件大小
    private long fileSize;
    //文件名称
    private String fileName;
    //文件类型
    private String fileType;
    //图片宽度
    private int fileWidth;
    //图片高度
    private int fileHeight;
    //用户id,用于授权
    private String userId;
    //业务key
    private String businesskey;
    //业务标签
    private String filetag;
    //文件元信息
    private Map metadata;

}

三、定义接口

package com.xuecheng.api.fileSystem;


import com.xuecheng.framework.domain.filesystem.response.UploadFileResult;
import org.springframework.web.multipart.MultipartFile;

public interface FileSystemControllerApi {
    public UploadFileResult upload(MultipartFile multipartFile,String filetag,String businesskey,String metadata);
    
}

四、dao层

package com.xuecheng.filesystem.dao;

import com.xuecheng.framework.domain.filesystem.FileSystem;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface FileSystemRespository extends MongoRepository<FileSystem,String> {
}

五、service层

package com.xuecheng.filesystem.service;

import com.alibaba.fastjson.JSON;
import com.xuecheng.filesystem.dao.FileSystemRespository;
import com.xuecheng.framework.domain.filesystem.FileSystem;
import com.xuecheng.framework.domain.filesystem.response.FileSystemCode;
import com.xuecheng.framework.domain.filesystem.response.UploadFileResult;
import com.xuecheng.framework.exception.ExceptionCast;
import com.xuecheng.framework.model.response.CommonCode;
import org.apache.commons.lang3.StringUtils;
import org.csource.fastdfs.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.Map;

@Service
public class FileSystemService {
    private static final Logger log = LoggerFactory.getLogger(FileSystemService.class);

    @Value("${xuecheng.fastdfs.tracker_service}")
    String tracker_server;
    @Value("${xuecheng.fastdfs.connect_timeout_in_seconds}")
    int connect_timeout_in_seconds;
    @Value("${xuecheng.fastdfs.network_timeout_in_seconds}")
    int network_timeout_in_seconds;
    @Value("${xuecheng.fastdfs.charset}")
    String charset;

    @Autowired
    FileSystemRespository fileSystemRespository;

    /**
     * 加载FastDFS配置
     */
    public void initFdfsConfig(){
        try {
            ClientGlobal.initByTrackers(tracker_server);
            ClientGlobal.setG_connect_timeout(connect_timeout_in_seconds);
            ClientGlobal.setG_network_timeout(network_timeout_in_seconds);
            ClientGlobal.setG_charset(charset);
        }catch (Exception e){
            e.printStackTrace();
            ExceptionCast.cast(FileSystemCode.FS_UPLOADFILE_SERVERFAIL);
        }

    }

    /**
     * 上传文件
     * @param multipartFile
     * @param filetag
     * @param businesskey
     * @param metadata
     * @return
     */
    public UploadFileResult upload(MultipartFile multipartFile,
                                   String filetag,
                                   String businesskey,
                                   String metadata){
        if (multipartFile == null){
            ExceptionCast.cast(FileSystemCode.FS_UPLOADFILE_FILEISNULL);
        }
        //上传文件到fdfs
        String[] strings = this.fdfs_upload(multipartFile);
        FileSystem fileSystem = new FileSystem();
        fileSystem.setFileId(strings[0]);
        fileSystem.setFilePath(strings[0]);
        fileSystem.setBusinesskey(businesskey);
        fileSystem.setFiletag(filetag);
        if (StringUtils.isEmpty(metadata)){
            try {
                Map map = JSON.parseObject(metadata, Map.class);
                fileSystem.setMetadata(map);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        fileSystem.setFileName(multipartFile.getName());
        fileSystem.setFileSize(multipartFile.getSize());
        fileSystem.setFileType(multipartFile.getContentType());
        fileSystemRespository.save(fileSystem);
        return new UploadFileResult(CommonCode.SUCCESS,fileSystem);

    }

    /**
     * 上传文件到fdfs,返回文件id
     * @param multipartFile
     * @return
     */
    public String[] fdfs_upload(MultipartFile multipartFile){
        try {
            //加载fdfs配置
            initFdfsConfig();
            //创建tracker client
            TrackerClient trackerClient = new TrackerClient();
            //获取trackerServer
            TrackerServer trackerServer = trackerClient.getConnection();
            //获取storage
            StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
            //创建storage client
            StorageClient storageClient = new StorageClient(trackerServer, storageServer);
            //上传文件
            byte[] bytes = multipartFile.getBytes();
            String originalFilename = multipartFile.getOriginalFilename();
            //文件拓展名
            String extname = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            String[] file = storageClient.upload_file(bytes, extname, null);
            return file;

        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

}

六、controller层

package com.xuecheng.filesystem.controller;

import com.xuecheng.api.fileSystem.FileSystemControllerApi;
import com.xuecheng.filesystem.service.FileSystemService;
import com.xuecheng.framework.domain.filesystem.response.UploadFileResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("/filesystem")
public class FileSystemController implements FileSystemControllerApi {
    
    @Autowired
    FileSystemService fileSystemService;
    
    
    @Override
    @PostMapping("/uoload")
    public UploadFileResult upload(@RequestParam("file") MultipartFile multipartFile,
                                   @RequestParam(value = "filetag",required = true) String filetag, 
                                   @RequestParam(value = "businesskey",required = false) String businesskey, 
                                   @RequestParam(value = "metedate" ,required = false) String metedata) {
        
        return fileSystemService.upload(multipartFile,filetag,businesskey,metedata);
    }
}

 

保存课程图片实现

图片上传到文件系统后,其他子系统如果想使用图片可以引用图片的地址,课程管理模块使用图片等方式是将图片地址保存到课程数据库中

一、定义接口

@ApiOperation("添加课程图片")
public ResponseResult addCoursePic(String courseId,String pic);

二、定义模型,对应数据库

@Data
@ToString
@Entity
@Table(name="course_pic")
@GenericGenerator(name = "jpa-assigned", strategy = "assigned")
public class CoursePic implements Serializable {
    private static final long serialVersionUID = -916357110051689486L;

    @Id
    @GeneratedValue(generator = "jpa-assigned")
    private String courseid;
    private String pic;

}

三、dao层

package com.xuecheng.manage_course.dao;

import com.xuecheng.framework.domain.course.CoursePic;
import org.springframework.data.jpa.repository.JpaRepository;

public interface CoursePicRepository extends JpaRepository<CoursePic,String> {
}

四、service

/**
 * 添加课程图片
 * @param courseid
 * @param pic
 * @return
 */
@Transactional
public ResponseResult saveCoursePic(String courseid,String pic){
    Optional<CoursePic> optional = coursePicRepository.findById(courseid);
    CoursePic coursePic = null;
    if (optional.isPresent()){
        coursePic= optional.get();
    }
    
    //没有课程图片则新建对象
    if (coursePic == null){
        coursePic = new CoursePic();
    }
    coursePic.setCourseid(courseid);
    coursePic.setPic(pic);
    
    coursePicRepository.save(coursePic);
    return  new ResponseResult(CommonCode.SUCCESS);
}

五、controller层

@Override
@PostMapping("/coursepic/add")
public ResponseResult addCoursePic(@RequestParam("courseid") String courseId, @RequestParam("pic") String pic) {
    return courseService.saveCoursePic(courseId,pic);
}

 

图片查询功能

一、定义接口

@ApiOperation("获取课程图片")
public CoursePic findCoursePic(String courseid);

二、service层

public CoursePic findCoursepic(String courseId){
    CoursePic coursePic= coursePicRepository.findByCourseid(courseId);
    return coursePic;
}

三、controller层

@Override
@GetMapping("/coursepic/;ist/{courseId}")
public CoursePic findCoursePic(@PathVariable("courseId") String courseid) {
    return courseService.findCoursepic(courseid);
}

 

课程图片删除功能

一、定义接口

@ApiOperation("删除课程图片")
public ResponseResult deleteCoursePic(String courseId);

二、dao层

long deleteByCourseid(String courseid);

三、service层

/**
 * 删除课程图片
 * @param courseId
 * @return
 */
@Transactional
public ResponseResult deleteCoursePic(String courseId){
    long result = coursePicRepository.deleteByCourseid(courseId);
    if (result>0){
        return new ResponseResult(CommonCode.SUCCESS);
    }
    return new ResponseResult(CommonCode.FAIL);
}

四、controller

@Override
@DeleteMapping("/coursepic/delete")
public ResponseResult deleteCoursePic(String courseId) {
    return courseService.deleteCoursePic(courseId);
}

 

© 著作权归作者所有

lianbang_W
粉丝 0
博文 91
码字总数 119029
作品 0
杭州
私信 提问
菜鸟窝机器学习工程师vip课(试听)

本节课为菜鸟窝人工智能课程:机器学习工程师VIP课程的试听课,如需免费开通视频可扫描下方二维码,勾搭助教Bella(微信ID:BT474849 )~https://www.cniao5.com/course/10250 一、菜鸟窝机器...

菜鸟窝
07/31
0
0
嵌入式开发培训学习多久?零基础嵌入式培训

嵌入式目前是IT行业发展热门行业之一,目前的人才市场对于嵌入式工程师的需求是非常多的。而且企业对嵌入式工程师的需求,达到全部需求量的60%~70%,嵌入式工程师的薪水相对较高。零基础嵌入...

长沙千锋
2018/05/31
0
0
你应该用3个小时学会编程

文章摘要: 人每天都在进行编程工作,编程对于人来说是很自然的. 你完全有能力在3个小时内学会编程. 也有必要闪电般的学会编程,以确认你是否喜欢这一行,并降低学习. 本文中的实验者–一个0基础...

燕十八
2014/01/07
0
0
Hadoop•Spark技术实战训练营,约你来挑战!

这里不鼓吹大数据技术战无不胜, 这里没有遥不可及的趋势展望, 这里更没有华而不实的“经典”案例; ——这是一次将大数据技术化繁为简的旅程—— 关于大数据技术,我们将为你抽丝剥茧,全面...

佳华ICT
2014/07/03
749
0
【AI 工程师】掌握这10个项目,秒杀90%面试者!

2017年人工智能给了我们太多的惊喜和变化,从今年开始,国际巨头们纷纷开始大踏步地战略转向——从移动优先转向AI优先:3月份的微软、4月份的Facebook、5月份的Google、6月份的苹果……乃至前...

dev_csdn
2017/12/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

x002-语言元素

变量命令规则 硬性规则: 变量名由字母(广义的Unicode字符,不包括特殊字符)、数字和下划线构成,数字不能开头。 大小写敏感(大写的a和小写的A是两个不同的变量)。 不要跟关键字(有特殊...

伟大源于勇敢的开始
今天
4
0
nginx反向代理配置

nginx配置文件位置/usr/local/nginx/conf/nginx.conf 配置文件修改: # cd /usr/local/nginx/conf # vim nginx.conf server {listen 80;server_name localhost;#charset k......

行者终成事
今天
5
0
OSChina 周日乱弹 —— 这是假的,和我之前的不一样

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐:《男孩》-梁博 / 陶孟童 / 肖和东 / 高誉容 《男孩》-梁博 / 陶孟童 / 肖和东 / 高誉容 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
17
1
Rust学习笔记一 数据类型

写在前面 我也不是什么特别厉害的大牛,学历也很低,只是对一些新语言比较感兴趣,接触过的语言不算多也不算少,大部分也都浅尝辄止,所以理解上可能会有一些偏差。 自学了Java、Kotlin、Python、...

MusiCodeXY
今天
5
0
Java 脚本引擎入门

Java Script Engine Java 脚本引擎可以将脚本嵌入Java代码中,可以自定义和扩展Java应用程序,自JDK1.6被引入,基于Rhino引擎,JDK1.8后使用Nashorn引擎,支持ECMAScript 5,但后期还可能会换...

阿提说说
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部