1. 程式人生 > >spring+mongodb 檔案上傳與下載實現

spring+mongodb 檔案上傳與下載實現

專案需要用的mongodb來儲存檔案

首先配置在spring配置檔案中配置mongodb
1.需要的jar包(maven依賴)

<dependency>
    <groupId>org.springframework.data</groupId>
     <artifactId>spring-data-mongodb</artifactId>
     <version>1.7.0.RELEASE</version>
 </dependency>

2.spring 配置檔案配置 applicationContext-mongodb.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:mongo="http://www.springframework.org/schema/data/mongo"
  xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd"
>
<!-- ignore-unresolvable 需要配成true 多xml讀取配置檔案時都需要加上 否則報錯 --> <context:property-placeholder location="classpath:config/mongo.properties" ignore-unresolvable="true" /> <!-- mongo 配置start --> <!-- connections-per-host: 每個主機答應的連線數(每個主機的連線池大小),當連線池被用光時,會被阻塞住 max-wait-time: 被阻塞執行緒從連線池獲取連線的最長等待時間(ms) connect-timeout:在建立(開啟)套接字連線時的超時時間(ms) socket-timeout:套接字超時時間;該值會被傳遞給Socket.setSoTimeout(int) slave-ok:指明是否答應驅動從次要節點或者奴隸節點讀取資料 --> <mongo:mongo id="mongo" replica-set="${mongo.replicaSet}"> <mongo:options connections-per-host="${mongo.connectionsPerHost}" threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}" connect-timeout="${mongo.connectTimeout}" max-wait-time="${mongo.maxWaitTime}" auto-connect-retry="${mongo.autoConnectRetry}" socket-keep-alive="${mongo.socketKeepAlive}" socket-timeout="${mongo.socketTimeout}" slave-ok="${mongo.slaveOk}" write-number="${mongo.writeNumber}" write-timeout="${mongo.riteTimeout}" write-fsync="${mongo.writeFsync}"/> </mongo:mongo> <!-- 設定使用的資料庫 名--> <mongo:db-factory id="mongoDbFactory" dbname="file" mongo-ref="mongo"/> <!-- mongodb的模板 --> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/> </bean> <!-- mongo 配置end --> </beans>

詳細配置可參見spring官方配置檔案

然後springMvc 上傳配置檔案配置
1.需要的jar包

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-io</artifactId>
    <version>1.3.2</version>
</dependency>

2.springMvc 配置

<!-- 定義檔案上傳解析器 -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 設定預設編碼 -->
        <property name="defaultEncoding" value="UTF-8"></property>
        <!-- 設定檔案上傳的最大值5MB,5*1024*1024 -->
        <property name="maxUploadSize" value="5242880"></property>
    </bean>

上傳工具類封裝FileUpAndDownLoadService .java

package com.r2cf.interactiveweb.service;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSFile;

/**
 * 檔案上傳下載工具類
 * @author zhangpeng
 *
 */
/**
 * @author zhangpeng
 *
 */
@Service
public class FileUpAndDownLoadService {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 獲取mongodb資料庫檔案操作物件
     * @return
     */
    private GridFS getGridFS(){
        DB db = mongoTemplate.getDb();
        GridFS gridFS= new GridFS(db,"fs");
        return gridFS;
    }

    /**
     * 檔案上傳
     * @param request
     * @return
     * @throws IOException 
     */
    public void upload(HttpServletRequest request,BigDecimal userId) throws IOException{
        GridFS gridFS= getGridFS();
        GridFSFile file = null;
        MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;
        Map<String, MultipartFile> fileMap = mRequest.getFileMap();       
        Iterator<Map.Entry<String, MultipartFile>> it = fileMap.entrySet().iterator();
        while(it.hasNext()){
            Map.Entry<String, MultipartFile> entry = it.next();
            MultipartFile mFile = entry.getValue();//獲取檔案
            file = gridFS.createFile(mFile.getInputStream());// 建立gridfs檔案
            file.put("filename", mFile.getOriginalFilename());
            file.put("userId", userId.toString());
            file.put("uploadDate", new Date());
            file.put("contentType",mFile.getContentType());
            file.save();

        }
    }

    /**
     * 檢視檔案
     * @param params k-v 搜尋條件 
     * @return
     */
    public List<GridFSDBFile> viewFiles(Map<String,String> params){
        GridFS gridFS= getGridFS();
        BasicDBObject basicDBObject = new BasicDBObject();
        for(Map.Entry<String, String> entry:params.entrySet()){
            String key= entry.getKey();
            String value=entry.getValue();
            basicDBObject.append(key, value);
        }
        List<GridFSDBFile> list = gridFS.find(basicDBObject);
        return list;
    }

    /**
     * 檔案檢視與下載
     * @param id 檔案唯一標示id
     * @param response
     * @throws IOException
     */
    public void downLoad(String id,HttpServletResponse response) throws IOException{
        GridFS gridFS= getGridFS();
        ObjectId objId = new ObjectId(id);
        GridFSDBFile gridFSDBFile =(GridFSDBFile)gridFS.findOne(objId);

        if (gridFSDBFile != null) {

            OutputStream sos = response.getOutputStream();

            response.setContentType("application/octet-stream");
            // 獲取原檔名
            String name = (String) gridFSDBFile.get("filename");
            String fileName = new String(name.getBytes("utf-8"), "ISO8859-1");

            // 設定下載檔名
            response.addHeader("Content-Disposition", "attachment; filename=\""
                    + fileName + "\"");

            // 向客戶端輸出檔案
            gridFSDBFile.writeTo(sos);
            sos.flush();
            sos.close();
        }
    }

    /**
     * 單檔案刪除
     * @param id 檔案唯一標識
     * @return
     */
    public String delete(String id){
        GridFS gridFS= getGridFS();
        ObjectId objId = new ObjectId(id);
        gridFS.remove(objId);
        return "success";
    }

}