分类 标签 存档 程序员漫画 黑壳相关站点 订阅 搜索

七牛云 Java Web 上传图片

342 浏览

本文由黑壳网原创

本文来源七牛云 Java Web 上传图片 - 黑壳网

壳叔搞笑一刻

没有对手

警官抓到正在赌博的四个人。“你们知道这是犯法的吗?” 警官向第一个人怒吼道。
“不,我只是在这里看看。”
警官又问第二个人:“你呢?”
“我是在等候巴士而已。
第三个也插嘴:“警官,我是在这里等我的女朋友。”
警官看了看第四个人,他拿着牌。于是责问他说:“你手中有物证,大概不能抵赖吧?”
他睨视着警官,回答说:“那么我是跟谁赌博呢?你说说看!”

今天要说的是七牛云介绍

今天主要就是在通过 Java Web 的方式上传图片并且获得图片路径。
先看一下界面,有点简短,请各位将就一下吧。
这是上传页面,没错就是两个按钮。

你以为点击完,会出现 Duang Duang Duang 的效果吗,想多了,只有更剪短的一行 img 标签显示

虽说界面过于清爽,但是功能是实打实的可以!

接下来开始抛代码!
单独 jar qiniuJar.tar - 城通网盘

maven 引入jar包
  <!-- 请求头参数分析包 -->
    <dependency>
      <groupId>eu.bitwalker</groupId>
      <artifactId>UserAgentUtils</artifactId>
      <version>1.20</version>
    </dependency>

    <!--七牛云上传图片服务-->
    <dependency>
      <groupId>com.qiniu</groupId>
      <artifactId>sdk</artifactId>
      <version>6.1.0</version>
    </dependency>

    <dependency>
      <groupId>com.squareup.okhttp3</groupId>
      <artifactId>okhttp</artifactId>
      <version>3.3.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.6.2</version>
      <scope>compile</scope>
    </dependency>
html 界面
<html>
<head>
    <title>七牛云服务示例</title>
</head>
<body>

<input type="file" id="upload" name="imagefile" />
<input type="button" value="上传" onclick="return ajaxFileUploadImage();"/><br>
<div id="imgurl">
</div>

<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery.min.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/global.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/ajaxfileupload.js"></script>
<script type="text/javascript" language="JavaScript" >
    //图片上传
    function ajaxFileUploadImage() {

        $.ajaxFileUpload({
            url: "<%=request.getContextPath()%>/qiniuUpload",//用于文件上传的服务器端请求地址
            secureuri: false,//一般设置为false
            fileElementId: 'upload',//文件上传控件的id属性  <input type="file" id="upload" name="upload" />
            dataType: 'text',//返回值类型 一般设置为json
            success: function (data)  //服务器成功响应处理函数
            {
//                console.log(data);
//                $("#imageUrl").html(data);
                var img = "&lt;img src="+data+"&gt;"
                var html = "<br><span>"+img+"</span>";
                $("#imgurl").append(html);
            }
        });
        return false;
    }
</script>

</body>
</html>
Controller类
import com.QiniuCommon.utils.CommonUtil;
import com.QiniuCommon.utils.ExecuteResult;
import com.QiniuCommon.utils.QiniuUtil;
import com.qiniu.api.auth.AuthException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;

/**
 * Created by kzyuan on 2017/6/20.
 */
@Controller
@RequestMapping(value = "")
public class QiniuController {

    private static Logger logger = LoggerFactory.getLogger(QiniuController.class);


    @RequestMapping("qiniuCommon")
    private String qiniuCommon(HttpServletRequest request){
        return "qiniuCommon";
    }


    /**
     * @param request
     * @param multipartFile
     * @return
     */
    @RequestMapping(value = "/qiniuUpload", method = RequestMethod.POST)
    @ResponseBody
    public String qiniuUpload(HttpServletRequest request, HttpServletResponse response, @RequestParam("imagefile") MultipartFile multipartFile) {
        ExecuteResult<String> executeResult = new ExecuteResult<String>();

        QiniuUtil qiniuUtil = new QiniuUtil();
        CommonUtil commonUtil = new CommonUtil();
        try {
            /**
             * 上传文件扩展名
             */
            String filenameExtension = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf("."), multipartFile.getOriginalFilename().length());

            /**
             * MultipartFile 转 file 类型
             */
            File file = commonUtil.multipartToFile(multipartFile);

            /**
             * 七牛云文件上传 服务  file文件 以及 文件扩展名
             */
            executeResult = qiniuUtil.uploadFile(file, filenameExtension);
            if (!executeResult.isSuccess()) {
                return "失败" + executeResult.getErrorMessages();
            }

        } catch (AuthException e) {
            logger.error("AuthException", e);
        }

        return executeResult.getResult();
    }

}
common.properties 配置文件
#一些公共的配置

#七牛云存储空间名
bucketName= 
#七牛云绑定域名
domain= 
#七牛云服务配置项 账号的ACCESS_KEY和SECRET_KEY
ACCESS_KEY= 
SECRET_KEY=
这是综合各种例子,最后总结出的一个比较完全的工具类
import com.qiniu.api.auth.AuthException;
import com.qiniu.api.auth.digest.Mac;
import com.qiniu.api.io.IoApi;
import com.qiniu.api.io.PutExtra;
import com.qiniu.api.io.PutRet;
import com.qiniu.api.rs.GetPolicy;
import com.qiniu.api.rs.PutPolicy;
import com.qiniu.api.rs.RSClient;
import com.qiniu.api.rs.URLUtils;
import org.json.JSONException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * 七牛云 手写工具类
 * Created by kzyuan on 2017/6/20.
 */
public class QiniuUtil {

    private static Logger logger = LoggerFactory.getLogger(QiniuUtil.class);

    PropertyUtil propertyUtil = new PropertyUtil();
    private String bucketName = propertyUtil.getProperty("bucketName");
    private String domain = propertyUtil.getProperty("domain");
    private String ACCESS_KEY = propertyUtil.getProperty("ACCESS_KEY");
    private String SECRET_KEY = propertyUtil.getProperty("SECRET_KEY");

    //通过文件路径上传文件
    public ExecuteResult<String> uploadFile(String localFile) throws AuthException, JSONException {
        File file = new File(localFile);
        /**
         * 文件后缀名 文件扩展名
         */
        String filenameExtension = localFile.substring(localFile.lastIndexOf("."), localFile.length());
        return uploadFile(file, filenameExtension);
    }

    //通过File上传
    public ExecuteResult<String> uploadFile(File file, String filenameExtension) throws AuthException, JSONException {
        ExecuteResult<String> executeResult = new ExecuteResult<String>();
        String uptoken = getUpToken();

        // 可选的上传选项,具体说明请参见使用手册。
        PutExtra extra = new PutExtra();
        SimpleDateFormat time = new SimpleDateFormat("yyyy/MM/dd");
        // 上传文件
        PutRet ret = IoApi.putFile(uptoken, time.format(new Date()) + "/" + UUID.randomUUID() + filenameExtension, file.getAbsolutePath(), extra);

        if (ret.ok()) {
            executeResult.setSuccessMessage("上传成功!");
            executeResult.setResult(domain+ret.getKey());
        } else {
            executeResult.addErrorMessage("上传失败");
        }
        return executeResult;
    }

    /**
     * 从 inputstream 中写入七牛
     *
     * @param key     文件名
     * @param content 要写入的内容
     * @return
     * @throws AuthException
     * @throws JSONException
     */
    public boolean uploadFile(String key, String content) throws AuthException, JSONException {
        // 读取的时候按的二进制,所以这里要同一
        ByteArrayInputStream inputStream = new ByteArrayInputStream(content.getBytes());

        String uptoken = getUpToken();

        // 可选的上传选项,具体说明请参见使用手册。
        PutExtra extra = new PutExtra();

        // 上传文件
        PutRet ret = IoApi.Put(uptoken, key, inputStream, extra);

        if (ret.ok()) {
            return true;
        } else {
            return false;
        }
    }

    //获得下载地址
    public String getDownloadFileUrl(String filename) throws Exception {
        Mac mac = getMac();
        String baseUrl = URLUtils.makeBaseUrl(domain, filename);
        GetPolicy getPolicy = new GetPolicy();
        String downloadUrl = getPolicy.makeRequest(baseUrl, mac);
        return downloadUrl;
    }

    //删除文件
    public void deleteFile(String filename) {
        Mac mac = getMac();
        RSClient client = new RSClient(mac);
        client.delete(domain, filename);
    }

    //获取凭证
    private String getUpToken() throws AuthException, JSONException {
        Mac mac = getMac();
        PutPolicy putPolicy = new PutPolicy(bucketName);
        String uptoken = putPolicy.token(mac);
        return uptoken;
    }

    private Mac getMac() {
        Mac mac = new Mac(ACCESS_KEY, SECRET_KEY);
        return mac;
    }

}
这个工具类注释说的很清楚,其实就是将MultipartFile 转换成File的一个过程
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import java.io.File;
import java.io.IOException;

/**
 * 公共工具类
 * Created by kzyuan on 2017/6/19.
 */
public class CommonUtil {

    /**
     * MultipartFile 转换成File
     *
     * @param multfile 原文件类型
     * @return File
     * @throws IOException
     */
    public File multipartToFile(MultipartFile multfile) {

        CommonsMultipartFile cf = (CommonsMultipartFile)multfile;
        //这个myfile是MultipartFile的
        DiskFileItem fi = (DiskFileItem) cf.getFileItem();
        File file = fi.getStoreLocation();
        return file;
    }

}

如果以上你觉得还是有点迷糊,那么GitHub 代码 是你的首选。

黑壳博客 blog.bhusk.com

E-mail:keshu@bhusk.com

本文由 黑壳博客的壳叔 创作或转载,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。

可自由转载、引用,但需署名作者且注明文章

评论  
留下你的脚步
推荐阅读