圖片等文件信息上傳阿里雲

最近公司要保存用戶的圖片信息到阿里雲,通過學習已經掌握了阿里雲基本上傳的開發步驟。過程仍是比較順利的,查看了不少博客,代碼都不是很全,本身爲了方便之後使用和回憶,因此我寫篇博客記錄一下當時的過程。由於api裏面有詳細的步驟,這裏我不在詳細描述,只寫代碼實現和大抵的步驟。html

①上傳阿里雲maven須要配置的jar包java

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>2.2.3</version>
</dependency>

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.4</version>
</dependency>

注:org.apache.httpcomponents必須爲4.4版本。web

若是mven裏面有4.3版本的httpclient 會形成版本衝突,配置以前先檢查mven裏面的配置。spring

若是有低版本,應先刪除再配置高版本的httpclient。(我由於這個半天都在報錯,切記)apache

②閱讀apiapi

地址:https://help.aliyun.com/document_detail/32010.html?spm=5176.doc32009.6.211.OeN2Uw安全

必須閱讀幾遍api,這樣流程會大抵熟悉服務器

③就是代碼部分(上傳接口)app

package com.zhongqi.ChessMember.client.web.controller.xaingqi;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;
import com.zhongqi.ChessMember.dto.UploadAddInfo;
import com.zhongqi.ChessMember.entity.UploadFile;
import com.zhongqi.ChessMember.service.xiangqi.UploadService;
import com.zhongqi.common.controller.BaseController;
import com.zhongqi.common.dto.JsonResponseResult;
import com.zhongqi.common.util.BaseUtils;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by jordan on 16/10/24.
 * @author 寧春筍
 */
@Controller
@RequestMapping("/clientUpload")
public class UploadController extends BaseController {
    Logger logger = Logger.getLogger(UploadController.class);

    @Autowired
    private UploadService uploadService;

    @RequestMapping("/upload")
    public void upload(@RequestParam(value = "file", required = false) MultipartFile uploadFile,
                       HttpServletRequest request, HttpServletResponse response)throws Exception {
        JsonResponseResult result = new JsonResponseResult();

        result.setCode(1);
        result.setMsg("導入文件失敗");

        if (!uploadFile.isEmpty()) {
            try {
                // 文件保存路徑
                String strPath = request.getSession().getServletContext().getRealPath("/uploadImgs");
                System.out.println(" strPath"+ strPath);

                //得到上傳文件的名字
                String fileName = uploadFile.getOriginalFilename();
                System.out.print("fileName"+fileName);

                //拿到文件的流進行加密
                FileInputStream fis = new FileInputStream(strPath + "/"+fileName);
                String fileMD5= DigestUtils.md5Hex(IOUtils.toByteArray(fis));
                UploadFile uploadFile1=uploadService.checkUploadFileInfo(fileMD5);
                if (uploadFile1==null){
                File file = new File(strPath + "/"+fileName);
                // 轉存文件到服務器
                uploadFile.transferTo(file);

                /**
                 * 從服務器讀取存儲阿里雲
                 * 上傳文件的名字:file.getName()
                 *
                 * 當前時間:getCurrentDate()
                 *
                 * 文件(bucketName裏面建立的)Constant.filePath
                 *
                 */
                String key =Constant.filePath+ "/" +getCurrentDate()+"/"+fileName;
                System.out.println("key"+key);
                String  filePath =strPath+ "/" +fileName;

                //  存儲阿里雲
                putObject(Constant.bucketName, key,filePath);
                UploadAddInfo uploadAddInfo =new UploadAddInfo();
                uploadAddInfo.setFileMD5(fileMD5);
                uploadAddInfo.setFilePath(key);
                uploadAddInfo.setUploadDate(new Date());
                Integer uploadId= uploadService.addUploadinfo(uploadAddInfo);
                    if (uploadId!=null){
                        result.setCode(0);
                        result.setMsg("導入成功");
                        result.setResponse(uploadAddInfo);
                    }

                }
            } catch (FileNotFoundException f) {
                logger.error(f);
                throw f;
            }
        }

        response(BaseUtils.toJsonFromObject(result), response,logger);
    }

    //  存儲阿里雲
    private  void putObject(String bucketName, String key, String filePath) throws FileNotFoundException {

        // 初始化OSSClient
        OSSClient client = DefaultOSSClient.getDefaultOSSClient();
        // 獲取指定文件的輸入流
        File file = new File(filePath);
        InputStream content = new FileInputStream(file);

        // 建立上傳Object的Metadata
        ObjectMetadata meta = new ObjectMetadata();

        // 必須設置ContentLength
        meta.setContentLength(file.length());
        Date expire = new Date(new Date().getTime() + 30 * 1000);
        meta.setExpirationTime(expire);

        // 上傳Object.
        PutObjectResult result = client.putObject(Constant.bucketName, key, content, meta);
        // 打印ETag
        System.out.println("etag--------------->" + result.getETag());
    }
    //時間處理
    private static String  getCurrentDate(){
        Date date =new Date();
        SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyyMMddHHmmss");
        String timeDate =simpleDateFormat.format(date);
        return timeDate;
    }
}

 

④用到的配置工具類maven

 

DefaultOSSClient類
package com.zhongqi.ChessMember.client.web.controller.xaingqi;

import com.aliyun.oss.OSSClient;
import com.zhongqi.ChessMember.client.config.DefaultClientConfiguration;

/**
 * Created by jordan on 16/10/21.
 * @author 寧春筍
 */
public class DefaultOSSClient {

    /*
     * Constructs a client instance with your account for accessing OSS
     */
    private static OSSClient client = new OSSClient(Constant.endpoint, Constant.accessKeyId, Constant.accessKeySecret, DefaultClientConfiguration.getDefalutClientConfig());

    private DefaultOSSClient() {

    }

    public static OSSClient getDefaultOSSClient(){
        if(client == null){
            client = new OSSClient(Constant.endpoint,Constant.accessKeyId, Constant.accessKeySecret,DefaultClientConfiguration.getDefalutClientConfig());
        }
        return client;
    }

    public static void shutdownOSSClient(){
        client.shutdown();
        client = null;
    }




}
Constant類

Constant類

package com.zhongqi.ChessMember.client.web.controller.xaingqi;

/**
 * Created by jordan on 16/10/21.
 * @author 寧春筍
 */
public  class Constant {
    public static String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    public static  String accessKeyId = "你的accessKeyId";
    public static String accessKeySecret = "你的accessKeySecret";
    public static  String bucketName = "本身建立的bucket";
    public static  String filePath="本身建立的上傳位置";
}

默認配置能夠查詢api本身定義

package com.zhongqi.ChessMember.client.config;

import com.aliyun.oss.ClientConfiguration;

/**
 * Created by jordan on 16/10/21.
 * 寧春筍
 */
public class DefaultClientConfiguration {
    // 建立ClientConfiguration實例
    private static final ClientConfiguration conf = new ClientConfiguration();

    private DefaultClientConfiguration() {
        // 設置OSSClient使用的最大鏈接數,默認1024
        conf.setMaxConnections(100);
        // 設置請求超時時間,默認50秒
        conf.setConnectionTimeout(5000);
        // 設置失敗請求重試次數,默認3次
        conf.setMaxErrorRetry(3);
        //Socket層傳輸數據的超時時間(單位:毫秒)。默認爲50000毫秒
        conf.setSocketTimeout(2000);
    }

    public static ClientConfiguration getDefalutClientConfig(){
        return conf;
    }
}

⑤service實現

package com.zhongqi.ChessMember.service.xiangqi.impl;

import com.zhongqi.ChessMember.dao.xiangqi.UploadDao;
import com.zhongqi.ChessMember.dto.UploadAddInfo;
import com.zhongqi.ChessMember.entity.UploadFile;
import com.zhongqi.ChessMember.service.xiangqi.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * Created by jordan on 16/10/24.
 */
@Service("uploadService")
public class UploadServiceImpl implements UploadService{

     @Autowired
     private UploadDao uploadDao;

    //存儲上傳信息
    @Override
    @Transactional
    public Integer addUploadinfo(UploadAddInfo uploadAddInfo) {
        return uploadDao.addUploadinfo(uploadAddInfo);
    }

    @Override
    public UploadFile checkUploadFileInfo(String fileMD5) {
        return uploadDao.checkUploadFileInfo(fileMD5);
    }
}

⑥dao實現

package com.zhongqi.ChessMember.dao.xiangqi.impl;

import com.zhongqi.ChessMember.dao.xiangqi.UploadDao;
import com.zhongqi.ChessMember.dto.UploadAddInfo;
import com.zhongqi.ChessMember.entity.UploadFile;
import com.zhongqi.common.dao.impl.BaseDaoImpl;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Repository;

/**
 * Created by jordan on 16/10/24.
 * @author 寧春筍
 */
@Repository("uploadDao")
public class UploadImpl extends BaseDaoImpl implements UploadDao {
    Logger logger = Logger.getLogger(UploadImpl.class);

    //存儲上傳信息
    @Override
    public Integer addUploadinfo(UploadAddInfo uploadAddInfo) {
        Integer result =0;

        UploadFile uploadFile =new UploadFile();
        uploadFile.setFileMD5(uploadAddInfo.getFileMD5());
        uploadFile.setFilePath(uploadAddInfo.getFilePath());
        uploadFile.setUploadDate(uploadAddInfo.getUploadDate());

        try {
            save(uploadFile);
            result=uploadFile.getId();
        }catch (Exception e){
            logger.error(e);
        }
        return result;
    }
    //效驗圖片MD5值
    @Override
    public UploadFile checkUploadFileInfo(String fileMD5) {
        String hql = "from UploadFile where fileMD5=?";
        Object[] params ={fileMD5};
        UploadFile uploadFile =(UploadFile)get(hql,params);
        return uploadFile;
    }
}

⑦實體和工具

package com.zhongqi.ChessMember.entity;

import javax.persistence.*;
import java.util.Date;

/**
 * Created by jordan on 16/10/24.
 * @author 寧春筍
 */
@Entity
@Table(name="uploadFile")
public class UploadFile {


    //主鍵
    private Integer id;

    // 文件MD5值
    private String fileMD5;

    // 存儲路徑
    private String filePath;

    //上傳日期
    private Date uploadDate;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id", unique = true, nullable = false)
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
    @Column(name="fileMD5",nullable=true)
    public String getFileMD5() {
        return fileMD5;
    }

    public void setFileMD5(String fileMD5) {
        this.fileMD5 = fileMD5;
    }
    @Column(name="filePath",nullable=true)
    public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }

    @Column(name="uploadDate",nullable=true)
    public Date getUploadDate() {
        return uploadDate;
    }

    public void setUploadDate(Date uploadDate) {
        this.uploadDate = uploadDate;
    }
}

UploadAddInfo類

package com.zhongqi.ChessMember.dto;

import java.util.Date;

/**
 * Created by jordan on 16/10/24.
 */
public class UploadAddInfo {
    //主鍵
    private Integer id;

    // 文件MD5值
    private String fileMD5;

    // 存儲路徑
    private String filePath;

    //上傳日期
    private Date uploadDate;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getFileMD5() {
        return fileMD5;
    }

    public void setFileMD5(String fileMD5) {
        this.fileMD5 = fileMD5;
    }

    public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }

    public Date getUploadDate() {
        return uploadDate;
    }

    public void setUploadDate(Date uploadDate) {
        this.uploadDate = uploadDate;
    }
}

以上是上傳涉及的全部代碼,上傳是一個比較經常使用的模塊,徹底能夠單拉一個站點出來。以便之後服用,阿里雲存儲安全性也比較高,避免用戶數據的丟失。做爲一個菜鳥,但願你們多多支持。2016/11/1 

相關文章
相關標籤/搜索