A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

【郑州校区】学成在线 第8天 讲义-课程图片管理 分布式文件系统二

1.1.3 API接口
1.1.3.1模型类
系统的文件信息(图片、文档等小文件的信息)在mongodb中存储,下边是文件信息的模型类。
1) 模型如下:
[AppleScript] 纯文本查看 复制代码
@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;
}

说明:
fifileIdfastDFS返回的文件ID
fifilePath:请求fastDFS浏览文件URL
fifiletag:文件标签,由于文件系统服务是公共服务,文件系统服务会为使用文件系统服务的子系统分配文件标签,用于标识此文件来自哪个系统。
businesskey:文件系统服务为其它子系统提供的个业务标识字段,各子系统根据自己的需求去使用,比如:课程管理会在此字段中存储课程id用于标识该图片属于哪个课程。
metadata:文件相关的元信息。
2) collection
mongodb创建数据库xc_fs(文件系统数据库),并创建集合 fifilesystem


1.1.3.2 Api接口
api工程下创建com.xuecheng.api.fifilesystem包,

[AppleScript] 纯文本查看 复制代码
public interface FileSystemControllerApi {
/
**
*
上传文件
*
@param multipartFile 文件
*
@param filetag 文件标签
*
@param businesskey 业务key
*
@param metedata 元信息,json格式
*
@return
*
/
public UploadFileResult upload(MultipartFile multipartFile,
String filetag,
String businesskey,
String metadata);
}

1.1.2.3 Dao
将文件信息存入数据库,主要存储文件系统中的文件路径。
[AppleScript] 纯文本查看 复制代码
 public interface FileSystemRepository extends MongoRepository<FileSystem,String> {
}


1.1.2.4 Service
[AppleScript] 纯文本查看 复制代码
 @Service
public class FileSystemService {
private static final Logger LOGGER = LoggerFactory
.
getLogger(FileSystemService.class);
@Value(
"
${xuecheng
.fastdfs.tracker_servers}
"
)
String tracker_servers;
@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
FileSystemRepository fileSystemRepository;
//加载fdfs的配置
private void initFdfsConfig(){
try {
ClientGlobal.initByTrackers(tracker_servers);
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_INITFDFSERROR);
}
}
//上传文件
public UploadFileResult upload(MultipartFile file,
String filetag,
String businesskey,
String metadata){
if(file
== null){
ExceptionCast.cast(FileSystemCode.FS_UPLOADFILE_FILEISNULL);
}
//上传文件到fdfs
String fileId
= fdfs_upload(file);
//创建文件信息对象
FileSystem fileSystem = new FileSystem();
//文件id
fileSystem.setFileId(fileId);
//文件在文件系统中的路径
fileSystem.setFilePath(fileId);
//业务标识
fileSystem.setBusinesskey(businesskey);
//标签
fileSystem.setFiletag(filetag);
//元数据
if(StringUtils.isNotEmpty(metadata)){
try {
Map map
=
JSON.
parseObject(metadata, Map
.class);
fileSystem.setMetadata(map);
} catch (Exception e) {
e.
printStackTrace();
}
}
//名称
fileSystem.setFileName(file.
getOriginalFilename());
//大小
fileSystem.setFileSize(file.
getSize());
//文件类型
fileSystem.setFileType(file.
getContentType());
fileSystemRepository
.save(fileSystem);
return new UploadFileResult(CommonCode.SUCCESS,fileSystem);
}
//上传文件到fdfs,返回文件id
public String fdfs_upload(MultipartFile file) {
try {
//加载fdfs的配置
initFdfsConfig();
//创建tracker client
TrackerClient trackerClient
= new TrackerClient();
//获取trackerServer
TrackerServer trackerServer =
trackerClient.
getConnection();
//获取storage
StorageServer storeStorage
=
trackerClient.
getStoreStorage(trackerServer);
//创建storage client
StorageClient1 storageClient1 = new StorageClient1(trackerServer,storeStorage);
//上传文件
//文件字节
byte[] bytes
= file.
getBytes();
//文件原始名称
String originalFilename
= file.
getOriginalFilename();
//文件扩展名
String extName
=
originalFilename.substring(originalFilename.lastIndexOf(
"
.
"
) + 1);
//文件id
String file1 =
storageClient1.upload_file1(bytes, extName, null);
return file1;
} catch (Exception e) {
e.
printStackTrace();
}
return null;
}
}


1.1.2.5 Controller
[AppleScript] 纯文本查看 复制代码
 @RestController
@RequestMapping(
"
/filesystem
"
)
public class FileSystemController implements FileSystemControllerApi {
@Autowired
FileSystemService fileSystemService;
@Override
@PostMapping(
"
/upload
"
)
public UploadFileResult upload(@RequestParam(
"
file
"
) MultipartFile file,
@RequestParam(value
=
"
filetag
"
, required
=
true) String
filetag,
@RequestParam(value
=
"
businesskey
"
, required
= false) String
businesskey,
@RequestParam(value
=
"
metedata
"
, required
= false) String
metadata) {
return fileSystemService.upload(file,filetag,businesskey,metadata);
}
}


1.1.2.6 测试
使用swagger-uipostman进行测试。
下图是使用swagger-ui进行测试的界面:



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马