欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 前端技术 > javascript >内容正文

javascript

用 Spring Boot 纯手工打造私人云网盘!!!

发布时间:2025/3/21 javascript 36 豆豆
生活随笔 收集整理的这篇文章主要介绍了 用 Spring Boot 纯手工打造私人云网盘!!! 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

前言

最近在做工作流的事情,正好有个需求,要添加一个附件上传的功能,曾找过不少上传插件,都不是特别满意。无意中发现一个很好用的开源web文件管理器插件 elfinder,功能比较完善,社区也很活跃,还方便二次开发。

环境搭建

软件地址
SpringBoothttps://spring.io/projects/spring-boot/
elFinderhttps://studio-42.github.io/elFinder/

项目截图

周末抽时间做了一个简单的案例,希望对大家有所帮助,下面是简单的项目截图。

项目功能

在线新建目录、文件、附件上传、下载、预览、在线打包,图片在线裁剪、编辑,实现列表试图、图标视图等等一些列功能。

项目配置

项目基于 SpringBoot 注解配置实现,在第三方插件进行二次开发。

application.properties 配置:

# 执行类,内部调用,实现前端相关功能 file-manager.command=com.itstyle.cloud.common.elfinder.command file-manager.thumbnail.width=80 file-manager.volumes[0].Node= file-manager.volumes[0].source=fileSystem file-manager.volumes[0].alias=file # 文件存放目录,可以自定义 file-manager.volumes[0].path=D:/cloudFile file-manager.volumes[0]._default=true file-manager.volumes[0].locale= file-manager.volumes[0].constraint.locked=false file-manager.volumes[0].constraint.readable=true file-manager.volumes[0].constraint.writable=true

ElfinderConfiguration 读取配置:

@Component @ConfigurationProperties(prefix="file-manager") //接收application.properties中的file-manager下面的属性 public class ElfinderConfiguration {private Thumbnail thumbnail;private String command;private List<Node> volumes;private Long maxUploadSize = -1L;//省略部分代码}

elfinderStorageFactory 初始化 基础Bean:

@Configuration public class ElFinderConfig {@Autowiredprivate ElfinderConfiguration elfinderConfiguration;@Bean(name = "commandFactory")public CommandFactory getCommandFactory() {CommandFactory commandFactory = new CommandFactory();commandFactory.setClassNamePattern(elfinderConfiguration.getCommand()+".%sCommand");return commandFactory;}@Bean(name = "elfinderStorageFactory")public ElfinderStorageFactory getElfinderStorageFactory() {DefaultElfinderStorageFactory elfinderStorageFactory = new DefaultElfinderStorageFactory();elfinderStorageFactory.setElfinderStorage(getElfinderStorage());return elfinderStorageFactory;}@Bean(name = "elfinderStorage")public ElfinderStorage getElfinderStorage() {DefaultElfinderStorage defaultElfinderStorage = new DefaultElfinderStorage();// creates thumbnailDefaultThumbnailWidth defaultThumbnailWidth = new DefaultThumbnailWidth();defaultThumbnailWidth.setThumbnailWidth(elfinderConfiguration.getThumbnail().getWidth().intValue());// creates volumes, volumeIds, volumeLocale and volumeSecuritiesCharacter defaultVolumeId = 'A';List<Node> elfinderConfigurationVolumes = elfinderConfiguration.getVolumes();List<Volume> elfinderVolumes = new ArrayList<>(elfinderConfigurationVolumes.size());Map<Volume, String> elfinderVolumeIds = new HashMap<>(elfinderConfigurationVolumes.size());Map<Volume, Locale> elfinderVolumeLocales = new HashMap<>(elfinderConfigurationVolumes.size());List<VolumeSecurity> elfinderVolumeSecurities = new ArrayList<>();// creates volumesfor (Node elfinderConfigurationVolume : elfinderConfigurationVolumes) {final String alias = elfinderConfigurationVolume.getAlias();final String path = elfinderConfigurationVolume.getPath();final String source = elfinderConfigurationVolume.getSource();final String locale = elfinderConfigurationVolume.getLocale();final Boolean isLocked = elfinderConfigurationVolume.getConstraint().isLocked();final Boolean isReadable = elfinderConfigurationVolume.getConstraint().isReadable();final Boolean isWritable = elfinderConfigurationVolume.getConstraint().isWritable();// creates new volumeVolume volume = VolumeSources.of(source).newInstance(alias, path);elfinderVolumes.add(volume);elfinderVolumeIds.put(volume, Character.toString(defaultVolumeId));elfinderVolumeLocales.put(volume, LocaleUtils.toLocale(locale));// creates security constraintSecurityConstraint securityConstraint = new SecurityConstraint();securityConstraint.setLocked(isLocked);securityConstraint.setReadable(isReadable);securityConstraint.setWritable(isWritable);// creates volume pattern and volume securityfinal String volumePattern = Character.toString(defaultVolumeId) + ElFinderConstants.ELFINDER_VOLUME_SERCURITY_REGEX;elfinderVolumeSecurities.add(new DefaultVolumeSecurity(volumePattern, securityConstraint));// prepare next volumeId characterdefaultVolumeId++;}defaultElfinderStorage.setThumbnailWidth(defaultThumbnailWidth);defaultElfinderStorage.setVolumes(elfinderVolumes);defaultElfinderStorage.setVolumeIds(elfinderVolumeIds);defaultElfinderStorage.setVolumeLocales(elfinderVolumeLocales);defaultElfinderStorage.setVolumeSecurities(elfinderVolumeSecurities);return defaultElfinderStorage;} }

CloudDiskController 控制层实现:

@Controller @RequestMapping("elfinder/connector") public class CloudDiskController {private static final Logger logger = LoggerFactory.getLogger(CloudDiskController.class);public static final String OPEN_STREAM = "openStream";public static final String GET_PARAMETER = "getParameter";@Resource(name = "commandFactory")private ElfinderCommandFactory elfinderCommandFactory;@Resource(name = "elfinderStorageFactory")private ElfinderStorageFactory elfinderStorageFactory;@RequestMappingpublic void connector(HttpServletRequest request, final HttpServletResponse response) throws IOException {try {response.setCharacterEncoding("UTF-8");request = processMultipartContent(request);}catch (Exception e) {throw new IOException(e.getMessage());}String cmd = request.getParameter(ElFinderConstants.ELFINDER_PARAMETER_COMMAND);ElfinderCommand elfinderCommand = elfinderCommandFactory.get(cmd);try {final HttpServletRequest protectedRequest = request;elfinderCommand.execute(new ElfinderContext() {@Overridepublic ElfinderStorageFactory getVolumeSourceFactory() {return elfinderStorageFactory;}@Overridepublic HttpServletRequest getRequest() {return protectedRequest;}@Overridepublic HttpServletResponse getResponse() {return response;}});}catch (Exception e) {logger.error("Unknown error", e);}}//省略部分代码 }

最后,前端页面引入:

// ... 省略,具体看源码。微信文章限制长度。

小结

总体来说个人使用还是非常不错的,当然对于一些成熟的网盘系统还是有一些差距。

源码:

https://gitee.com/52itstyle/spring-boot-CloudDisk

总结

以上是生活随笔为你收集整理的用 Spring Boot 纯手工打造私人云网盘!!!的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。