webuploader+springmvc实现图片上传功能

  1. 前提条件
    在使用webuploader+springmvc进行图片上传之前,需要确保以下条件已准备就绪:

  2. 服务器环境:

    • JDK:1.8及以上;
    • Tomcat:7.0及以上;
    • SpringFramework:4.0.9及以上;
    • Maven或Gradle;
    • webuploader插件。
  3. 整体思路:

    • 利用webuploader插件进行文件上传,前端通过ajax向服务器发送请求;
    • 后端使用SpringMVC框架接收请求,并对接收到的文件进行处理。
  4. Maven依赖配置
    添加以下依赖来实现文件上传功能:

<!--webuploader依赖-->
<dependency>
    <groupId>com.github.tobato</groupId>
    <artifactId>fastdfs-client-java</artifactId>
    <version>1.27-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>com.github.tobato</groupId>
    <artifactId>fastdfs-common</artifactId>
    <version>1.27-SNAPSHOT</version>
</dependency>

<!--SpringMVC依赖-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.8</version>
</dependency>
  1. 配置fastDFS
    fastDFS是一款开源的分布式文件系统,支持海量文件的存储和访问。本例中使用的是fastdfs-client-java:一个Java客户端。

修改application.properties文件,添加如下配置:

fdfs.connect_timeout=5000
fdfs.network_timeout=50000
fdfs.charset=UTF-8
fdfs.http.tracker_http_port=80
fdfs.http.anti_steal_token=false
fdfs.http.secret_key=
fdfs.tracker_servers=192.168.2.111:22122,192.168.2.112:22122
  1. 涉及代码实现

1) 前端页面代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>webuploader+springmvc示例</title>
    <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="webuploader.css">
</head>
<body>
<h3 style="text-align:center;">webuploader+springmvc示例</h3>
<div id="uploader" class="wu-example">
    <div class="queueList">
        <div id="dndArea" class="placeholder">
            <div id="filePicker"></div>
            <p>或将文件拖到此处,单次最多可选300张</p>
        </div>
    </div>
    <div class="statusBar" style="display:none;">
        <div class="progress">
            <span class="text">0%</span>
            <span class="percentage"></span>
        </div><div class="info"></div>
        <div class="btns">
            <div id="filePicker2"></div><div class="uploadBtn">开始上传</div>
        </div>
    </div>
</div>
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript" src="https://cdn.bootcss.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
<script src="webuploader.js"></script>
<script type="text/javascript">
    var $list = $('#fileList');
    var $btn = $('#ctlBtn');
    var uploader = WebUploader.create({
        // 选完文件后,是否自动上传。
        auto: false,

        // swf文件路径
        swf: 'Uploader.swf',

        // 文件接收服务端。
        server: '/upload/uploadImg',

        // 选择文件的按钮。可选。
        // 内部根据当前运行是创建,可能是input元素,也可能是flash.
        pick: '#filePicker',

        // 只允许选择图片文件。
        accept: {
            title: 'Images',
            extensions: 'gif,jpg,jpeg,bmp,png',
            mimeTypes: 'image/*'
        }
    });

    // 当有文件添加进来的时候
    uploader.on( 'fileQueued', function( file ) {
        var $li = $(
            '<div id="' + file.id + '" class="file-item thumbnail">' +
            '<img>' +
            '<div class="caption">' + file.name + '</div>' +
            '</div>'
        ),
            $img = $li.find('img');

        // $list为容器jQuery实例
        $list.append( $li );

        // 创建缩略图
        uploader.makeThumb( file, function( error, src ) {
            if ( error ) {
                $img.replaceWith('<span>不能预览</span>');
                return;
            }

            $img.attr( 'src', src );
        }, 100, 100 );

        // 绑定删除事件
        $li.on('click', function() {
            $li.fadeOut();
            uploader.removeFile(file);
        });
    });

    // 文件上传过程中创建进度条实时显示。
    uploader.on( 'uploadProgress', function( file, percentage ) {
        var $li = $( '#'+file.id ),
            $percent = $li.find('.progress .progress-bar');

        // 避免重复创建
        if ( !$percent.length ) {
            $percent = $('<div class="progress progress-striped active">' +
              '<div class="progress-bar" role="progressbar" style="width: 0%">' +
              '</div>' +
            '</div>').appendTo( $li ).find('.progress-bar');
        }

        $li.find('p.state').text('上传中');

        $percent.css( 'width', percentage * 100 + '%' );
    });

    uploader.on('uploadSuccess', function(file, response) {
        $( '#'+file.id ).find('p.state').text('已上传');
        console.info('图片上传成功', response.imgPath, response.fileName);
    });

    uploader.on('uploadError', function(file) {
        $( '#'+file.id ).find('p.state').text('上传出错');
        console.info('图片上传失败', file);
    });

    uploader.on('uploadComplete', function(file) {
        $( '#'+file.id ).find('.progress').fadeOut();
    });

    $btn.on( 'click', function() {
        uploader.upload();
    });
</script>
</body>
</html>

2) 后端代码

@Controller
@RequestMapping("/upload")
public class UploadController {
    private static Logger logger = LoggerFactory.getLogger(UploadController.class);

    @Autowired
    private FastDFSUtil fastDFSUtil;

    /**
     * 跳转到上传图片页面
     */
    @GetMapping("/toUploadImgPage")
    public String toUploadImgPage() {
        return "uploadImg";
    }

    /**
     * 上传图片
     */
    @RequestMapping(value = "/uploadImg")
    @ResponseBody
    public RenderUtil uploadImg(@RequestParam(value = "file", required = false) MultipartFile file) {
        try {
            String fileName = file.getOriginalFilename();
            String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
            String imgPath = fastDFSUtil.upload(file.getBytes(), suffix);

            return RenderUtil.ok("imgPath", imgPath).put("fileName", fileName);
        } catch (IOException e) {
            logger.error("upload img failed", e);
            return RenderUtil.error("上传图片失败!");
        }
    }
}

3) FastDFS上传工具类

@Component
public class FastDFSUtil {
    private static final Logger logger = LoggerFactory.getLogger(FastDFSUtil.class);

    private static final String CONFIG_FILENAME = "fdfs_client.conf";

    @PostConstruct
    public void init() {
        try {
            ClientGlobal.init(this.getClass().getClassLoader().getResource(CONFIG_FILENAME).getFile());
        } catch (IOException | MyException e) {
            logger.error("FastDFS客户端初始化失败", e);
        }
    }

    /**
     * 上传文件
     * @return 图片访问地址
     */
    public String upload(byte[] file, String suffix) {
        // 创建tracker客户端
        TrackerClient trackerClient = new TrackerClient();
        try {
            // 获取连接
            TrackerServer trackerServer = trackerClient.getConnection();
            // 获取storage客户端
            StorageServer storageServer = null;
            StorageClient1 storageClient1 = new StorageClient1(trackerServer, storageServer);
            String fileId = storageClient1.upload_file1(file, suffix, null);
            return fileId;
        } catch (IOException | MyException e) {
            logger.error("upload file failed", e);
        }
        return null;
    }
}
  1. 总结与注意事项
    在使用webuploader+springmvc开发图片上传功能时,需要注意以下几点:

  2. 文件上传大小限制;

  3. 文件上传格式限制;
  4. webuploader的使用;
  5. fastDFS的配置及使用;
  6. 文件上传状态及进度的显示;
  7. 如何对上传的文件进行处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:webuploader+springmvc实现图片上传功能 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 如何使用Java动态代理?

    如何使用Java动态代理 Java动态代理是一种在运行时动态生成代理类和代理对象的技术。与静态代理相比,Java动态代理无需手动编写代理类,可以更方便地进行代理操作。本文将详细讲解如何使用Java动态代理。 什么是Java动态代理 Java动态代理是一种在运行时动态生成代理类和代理对象的技术,其基本原理是实现了代理对象所实现的接口并且将方法的调用转发到指定的…

    Java 2023年5月11日
    00
  • Java 数据库连接池详解及简单实例

    Java 数据库连接池详解及简单实例 数据库连接池是一种管理数据库连接的技术,它使用一组数据库连接来避免在每个请求中重复创建和释放数据库连接的开销。本文将详细介绍Java中如何使用数据库连接池技术。 什么是数据库连接池 数据库连接池是一种可以在应用程序启动时创建并保持在内存中的一组预配置的数据库连接。当应用程序需要连接到数据库时,它可以从连接池中获取一个空闲…

    Java 2023年6月16日
    00
  • Spring Boot 整合持久层之MyBatis

    Spring Boot 整合持久层之MyBatis 介绍 在Spring Boot中,我们可以通过整合MyBatis,来实现对数据库的访问。本篇文章将会介绍如何使用Spring Boot来整合MyBatis,完成对数据库的访问。 第一步:配置pom.xml文件 在我们的应用中配置MyBatis,需要添加以下依赖: <dependency> &lt…

    Java 2023年5月19日
    00
  • 瑞吉外卖day1

    项目整体介绍 项目介绍 本项目(瑞吉外卖)是专门为餐饮企业(餐厅、饭店)定制的一款软件产品,包括系统管理后台和移动端应用两部分。其中系统管理后台主要提供给餐饮企业内部员工使用,可以对餐厅的菜品、套餐、订单等进行管理维护。移动端应用心主要提供给消费者使用,可以在线浏览菜品、添加购物车、下单等。本项目共分为3期进行开发:第一期主要实现基本需求,其中移动端应用通过…

    Java 2023年5月6日
    00
  • 图片路径中含有中文在jsp下不能正常显示的原因及解决

    当图片路径中含有中文字符时,若在jsp页面中直接引用该路径,可能导致图片无法正常显示。这是因为URL是英文字符编码的,中文字符在URL中必须进行编码,如果不编码,就出现了上述问题。 为了解决这个问题,我们可以采取以下两种方法: 1. 对中文字符进行编码 使用URLEncoder对包含中文字符的字符串进行编码,然后将编码后的字符串作为图片路径。示例代码如下: …

    Java 2023年6月15日
    00
  • Netty结合Protobuf进行编解码的方法

    Netty结合Protobuf进行编解码的方法可以分为以下步骤: 添加依赖 为了使用Netty结合Protobuf进行编解码,需要添加以下两个依赖到项目的构建文件中: <!– 定义 protobuf 插件 –> <plugin> <groupId>org.xolstice.maven.plugins</group…

    Java 2023年5月20日
    00
  • 使用maven-assembly-plugin如何打包多模块项目

    使用maven-assembly-plugin打包多模块项目需要分为以下几个步骤: 在父项目中添加maven-assembly-plugin插件,并对子模块的打包进行配置; 子模块中添加打包所需相关资源,并配置打包信息。 下面提供两个示例来更清晰地讲解上述步骤。 示例1: 假设我们有一个项目,该项目包含一个父项目和两个子模块:模块A和模块B。我们希望使用ma…

    Java 2023年5月19日
    00
  • Maven如何构建可执行的jar包(包含依赖jar包)

    Maven是一个流行的Java构建工具,可以自动化构建、管理和部署Java项目。将Java项目打包成可执行的jar包是Maven常见的一个任务,特别是包含依赖jar包的情况。以下是构建可执行的jar包的完整攻略: 步骤一:配置Maven pom.xml文件 在Maven项目的根目录下,打开pom.xml文件,添加以下插件和配置: <build> …

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部