热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

基于SpringBoot实现上传2种方法工程代码实例

这篇文章主要介绍了基于SpringBoot实现上传工程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

创建SpringBoot工程:

再导入所需要的依赖:


   net.oschina.zcx7878
   fastdfs-client-java
   1.27.0.0
  

  
   org.apache.commons
   commons-lang3
  

创建上传业务层程序:

package cn.dzz.fastdfs.service;

import org.apache.commons.lang3.StringUtils;
import org.csource.fastdfs.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.Map;

/**
 * @author DaiZhiZhou
 * @file Boot-With-FastDFS
 * @create 2020-08-13 8:55
 */

// @PropertySource()
@Component
public class UploadService {


 @Value("${fastdfs.tracker_servers}")
 private String tracker_servers;

 @Value("${fastdfs.connect_timeout_in_seconds}")
 private int connect_timeout;

 @Value("${fastdfs.network_timeout_in_seconds}")
 private int network_timeout;

 @Value("${fastdfs.charset}")
 private String charset;

 public Map upload(MultipartFile multipartFile) {
  if (multipartFile == null) {
   throw new RuntimeException("文件不能为空");
  }
  // 上传至fastDFS, 返回文件id
  String fileId = this.fdfsUpload(multipartFile);
  if (StringUtils.isEmpty(fileId)) {
   System.out.println("上传失败");
   throw new RuntimeException("上传失败");
  }
  Map map=new HashMap<>();
  map.put("code",200);
  map.put("msg","上传成功");
  map.put("fileId",fileId);
  return map;
 }


 /**
  * 上传至fastDFS
  * @param multipartFile
  * @return 文件id
  */
 private String fdfsUpload(MultipartFile multipartFile) {
  // 1. 初始化fastDFS的环境
  initFdfsConfig();
  // 2. 获取trackerClient服务
  TrackerClient trackerClient = new TrackerClient();
  try {
   TrackerServer trackerServer = trackerClient.getConnection();
   // 3. 获取storage服务
   StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);
   // 4. 获取storageClient
   StorageClient1 storageClient1 = new StorageClient1(trackerServer, storeStorage);
   // 5. 上传文件 (文件字节, 文件扩展名, )
   // 5.1 获取文件扩展名
   String originalFilename = multipartFile.getOriginalFilename();
   String extName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
   // 5.2 上传
   String fileId = storageClient1.upload_file1(multipartFile.getBytes(), extName, null);
   return fileId;
  } catch (Exception e) {
   System.out.println(e);
   return null;
  }
 }

 /**
  * 初始化fastDFS的环境
  */
 private void initFdfsConfig() {
  try {
   ClientGlobal.initByTrackers(tracker_servers);
   ClientGlobal.setG_connect_timeout(connect_timeout);
   ClientGlobal.setG_network_timeout(network_timeout);
   ClientGlobal.setG_charset(charset);
  } catch (Exception e) {
   System.out.println(e);
  }
 }
}

创建上传控制器:

package cn.dzz.fastdfs.controller;

import cn.dzz.fastdfs.service.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import java.util.Map;

/**
 * @author DaiZhiZhou
 * @file Boot-With-FastDFS
 * @create 2020-08-13 8:58
 */

@RestController
@RequestMapping("upload")
public class UploadController {
 
 @Autowired
 private UploadService uploadService;
 
 /**
  * 作上传
  */
 @RequestMapping("doUpload")
 public Map doUpload(MultipartFile mf){
  System.out.println(mf.getOriginalFilename());
  Map map = uploadService.upload(mf);
  return map;
 }
}

在static目录中创建index.html用于上传测试:




 
 



文件上传


运行SpringBoot进行测试:

测试成功:

查看文件位置也可以被访问到:

上传文件实现方式二:

更改依赖:


  
   com.github.tobato
   fastdfs-client
   1.26.7
  

创建一个配置类UploadProperties

package cn.dzz.fastdfs.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author DaiZhiZhou
 * @file Boot-With-FastDFS
 * @create 2020-08-13 9:10
 */

@Data
@Component
@ConfigurationProperties(prefix = "upload")
public class UploadProperties {
 private String baseUrl;
 private List allowTypes;
}

更改之前的yml配置:

fdfs:
 so-timeout: 2500  # 读取时间
 connect-timeout: 600 # 连接超时时间
 thumb-image:   # 缩略图
 width: 100
 height: 100
 tracker-list:   # tracker服务配置地址列表
 - 服务器或者虚拟机IP:22122
upload:
 base-url: http://服务器或者虚拟机IP/
 allow-types:
 - image/jpeg
 - image/png
 - image/bmp
 - image/gif

编写UploadProperties.java

package cn.dzz.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.List;

/**
 * @author DaiZhiZhou
 * @file fdfs
 * @create 2020-08-13 9:33
 */
@ConfigurationProperties(prefix = "upload")
@Data
public class UploadProperties {
 private String baseUrl;
 private List allowTypes;
}

业务层:

package cn.dzz.service;

import cn.dzz.config.UploadProperties;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;

/**
 * @author DaiZhiZhou
 * @file fdfs
 * @create 2020-08-13 9:34
 */

@Component
@EnableConfigurationProperties(UploadProperties.class)
public class UploadService {
 private Log log= LogFactory.getLog(UploadService.class);

 @Autowired
 private FastFileStorageClient storageClient;

 @Autowired
 private UploadProperties prop;

 public String uploadImage(MultipartFile file) {
  // 1、校验文件类型
  String cOntentType= file.getContentType();
  if (!prop.getAllowTypes().contains(contentType)) {
   throw new RuntimeException("文件类型不支持");
  }
  // 2、校验文件内容
  try {
   BufferedImage image = ImageIO.read(file.getInputStream());
   if (image == null || image.getWidth() == 0 || image.getHeight() == 0) {
    throw new RuntimeException("上传文件有问题");
   }
  } catch (IOException e) {
   log.error("校验文件内容失败....{}", e);
   throw new RuntimeException("校验文件内容失败"+e.getMessage());
  }

  try {
   // 3、上传到FastDFS
   // 3.1、获取扩展名
   String extension = StringUtils.substringAfterLast(file.getOriginalFilename(), ".");
   // 3.2、上传
   StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), extension, null);
   // 返回路径
   return prop.getBaseUrl() + storePath.getFullPath();
  } catch (IOException e) {
   log.error("【文件上传】上传文件失败!....{}", e);
   throw new RuntimeException("【文件上传】上传文件失败!"+e.getMessage());
  }
 }
}

控制器:

package cn.dzz.controller;

import cn.dzz.service.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.Map;

/**
 * @author DaiZhiZhou
 * @file fdfs
 * @create 2020-08-13 9:35
 */
@RequestMapping("upload")
@RestController
public class UploadController {

 @Autowired
 private UploadService uploadService;

 @RequestMapping("doUpload")
 public Map doUpload(MultipartFile multipartFile) {
  System.out.println(multipartFile.getOriginalFilename());
  Map map = new HashMap<>();
  String filePath = uploadService.uploadImage(multipartFile);
  map.put("filePath", filePath);
  return map;
 }

}

还是一样的上传页面:




 
 



文件上传


运行发现空指针异常,检查发现表单名称没对上,SpringMVC就无法转换了

再次测试:

访问:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
author-avatar
GloryWumie
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有