SpringMVC 文件上传以及整合七牛云

本贴最后更新于 2430 天前,其中的信息可能已经时移世异

487a14642ed34bed837c05466462e4b6-WX20180310004049.png

需求:
最近在写自己的小玩具中, 有一个需求是是展示数量不多的轮播图.
方案一:自己搭建一个 ftp 服务器上传图片 然后再搭建一个 nginx 服务器来访问
方案二:采用七牛云存储平台
这里我采用的是方案二 因为上传的数量并不多, 不用费劲用搭建静态资源服务器.

第零步: 准备工作

关于七牛云的介绍和注册使用读者可以自己查看官网
https://www.qiniu.com/
使用七牛云作为图片等静态资源存储的话 查看 对象存储功能。
在实现上传文件到七牛云之前需要准备三个东西。
String accessKey = "your access key"; // 个人中心密钥管理中的 AK
String secretKey = "your secret key"; // 个人中心密钥管理中的 SK
String bucket = "your bucket name"; // 对象存储空间名

第一步: 加入七牛云的官方 sdk

pom.xml

<!-- 上传图片到七牛云 -->
<dependency>
    <groupId>com.qiniu</groupId>
    <artifactId>qiniu-java-sdk</artifactId>
    <version>7.2.0</version>
</dependency>

第二步: 编写前端页面

editUserInfo.jsp

<!-- 上传图片是需要指定属性 enctype="multipart/form-data" -->
<form id="userForm" action="${pageContext.request.contextPath }/updateUserInfo.action" method="post" enctype="multipart/form-data">
    <input type="hidden" name="id" value="${user.id }"/>
    <table width="100%" class="gridtable">
        <tr>
            <td>用户昵称</td>
            <td><input type="text" name="name" value="${user.name }"/></td>
        </tr>
       
        <tr>
            <td>注册时间</td>
            <td><input type="text" name="createtime"
                       value="<fmt:formatDate value="${user.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
        </tr>
        <tr>
            <td>用户头像</td>
            <td>
                <input type="hidden" name="pic" value="${user.avatar }"/>
                <c:if test="${user.avatar !=null}">
                    <img src="${user.avatar}" width=100 height=100 id="preview" />
                    <br/>
                </c:if>
                <input type="file" name="pictureFile" onchange="imgPreview(this)"/>
            </td>
        </tr>
        <tr>
            <td>签名档</td>
            <td><textarea rows="3" cols="30" name="signature">${user.signature }</textarea>
            </td>
        </tr>
        <tr>
            <td colspan="2" align="center"><input type="submit" value="提交"/>
            </td>
        </tr>
    </table>

</form>
<script type="text/javascript">

	<!-- 实现上传图片预览功能 -->
    function imgPreview(fileDom){
        //判断是否支持FileReader
        if (window.FileReader) {
            var reader = new FileReader();
        } else {
            alert("您的设备不支持图片预览功能,如需该功能请升级您的设备!");
        }

        //获取文件
        var file = fileDom.files[0];
        var imageType = /^image\//;
        //是否是图片
        if (!imageType.test(file.type)) {
            alert("请选择图片!");
            return;
        }
        //读取完成
        reader.onload = function(e) {
            //获取图片dom
            var img = document.getElementById("preview");
            //图片路径设置为读取的图片
            img.src = e.target.result;
        };
        reader.readAsDataURL(file);
    }
</script>

第三步: 编写上传图片工具类

UploadUtil.java

/**
 * 上传图片到七牛云
 */
public class UploadUtil {

    /**
     * 上传文件到七牛云, 并返回网络地址
     *
     * @param file
     * @return
     */

    public static String uploadImgToQiuniu(MultipartFile file) throws Exception {

        String imgUrl = "";

        Configuration cfg = new Configuration(Zone.zone0());

        //...其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);
        //...生成上传凭证,然后准备上传
        String accessKey = Constant.ACCESS_KEY;
        String secretKey = Constant.SECRET_KEY;
        String bucket = Constant.BUCKET;

        // 如果不指定 key 值,以文件内容的 hash 值作为文件名
        // 获取原文件名的后缀
        String originalFilename = file.getOriginalFilename();
        String extName = originalFilename.substring(originalFilename.lastIndexOf("."));
        String key = UuidUtil.getUUID() + extName;
        try {
            byte[] uploadBytes = file.getBytes();
            Auth auth = Auth.create(accessKey, secretKey);
            String upToken = auth.uploadToken(bucket);
            try {
                Response response = uploadManager.put(uploadBytes, key, upToken);
                //解析上传成功的结果
                DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
                System.out.println(putRet.key);
                System.out.println(putRet.hash);
                imgUrl = Constant.QIUNIU_DOMAIN + "/" + putRet.key;
            } catch (QiniuException ex) {
                Response r = ex.response;
                System.err.println(r.toString());
                try {
                    System.err.println(r.bodyString());
                } catch (QiniuException ex2) {
                    //ignore
                }
            }
        } catch (UnsupportedEncodingException ex) {
            //ignore
        }
        return imgUrl;
    }

编写一个常量 constant.java

package com.liuyishi.ssm.constant;

public interface Constant {

   String ACCESS_KEY = "5KolRGQ4iB***SwNk9dj1hno";
   String SECRET_KEY = "YIYRKoDbtpr***rw3cQ6Qcu67a9q5JnkgJ";
   String BUCKET = "develop";
   String QIUNIU_DOMAIN = "http://p5b***eis.bkt.clouddn.com";

}

第四步: 编写 UserController

@RequestMapping("/updateUserInfo")
   public String updateImg(User user, MultipartFile pictureFile) throws Exception {

       System.out.println("pictureFile = " + pictureFile);

       if (pictureFile.getSize() != 0) {
           String path = UploadUtil.uploadImgToQiuniu(pictureFile);
           items.setPic(path);
       }

       // 调用service的方法 更新数据库
       userService.updateUserInfo(user);

       return "redirect:/userList.action";
   }

c18412f6a9d440b9aee6ae7427c13604-1520613560814.jpg

至此, 整个上传图片到七牛云的功能实现.

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3186 引用 • 8212 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • Tnima

    请大家不要参看此贴进行使用.