用java的servlet實現http訪問mongodb中的文件

openkk 12年前發布 | 42K 次閱讀 MongoDB NoSQL數據庫

一個java的servlet文件(FileCtrl .java): 

import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.gridfs.GridFSDBFile;
import java.io.IOException;
import java.net.URLDecoder;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FileCtrl extends HttpServlet {

private static final long serialVersionUID = -1504839175114429753L;

private Date getDateByString(String format, String dateStr) throws ParseException{ SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.parse(dateStr); }

private boolean needCache(String ext){//判斷文件是否需要緩存。
    if(ext == null){
        return false;
    }
    boolean need = false;
    String[] arr = {"jpg", "jpeg", "png", "gif", "bmp", "html", "htm", "swf", "mp3", "mp4", "pdf"};
    for(String s : arr){
        if(s.equals(ext)){
            need = true;
            break;
        }
    }
    return need;
}

private String getContentType(String ext){
    String type = null;
    if(ext == null){
        type = "application/octet-stream";
    }
    else if(ext.equals("jpg")){
        type = "image/jpeg";
    }
    else if(ext.equals("jpeg") || ext.equals("png") || ext.equals("gif") || ext.equals("bmp")){
        type = "image/" + ext;
    }
    else if(ext.equals("html") || ext.equals("htm")){
        type = "text/html; charset=utf-8";
    }
    else if(ext.equals("swf")){
        type = "application/x-shockwave-flash";
    }
    else if(ext.equals("mp3")){
        type = "audio/x-mpeg";
    }
    else if(ext.equals("mp4")){
        type = "video/mp4";
    }
    else if(ext.equals("pdf")){
        type = "application/pdf";
    }
    else{
        type = "application/octet-stream";
    }
    return type;
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 response.setContentType("text/html; charset=utf-8");
    String url = URLDecoder.decode(request.getRequestURI(), "utf-8");  //doget方法可以訪問帶漢字的url
    int second = url.indexOf("/files/", 1);
    url = url.substring(second + 7);
    String[] arr = url.split("/");
    DBObject query = new BasicDBObject("filename", arr[2]);
    query.put("type", arr[0]);
    try {

query.put("publishDate", getDateByString("yyyy-MM-dd", arr[1])); } catch (ParseException e1) { System.out.println(e1.getMessage()); } GridFS fs = new GridFS(mongo.getDB(database));//連接mongodb數據庫;細節就不詳述。 GridFSDBFile f = fs.getFs().findOne(query); if(f == null){ PubFun.ajaxPrintC("此文件不存在!", response); }else{ String ext = null; int index = arr[2].lastIndexOf("."); if(index > 0){ ext = arr[2].substring(index+1).toLowerCase(); } response.setContentType(getContentType(ext)); if(needCache(ext)){ String modifiedSince = request.getHeader("If-Modified-Since"); DateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH); df.setTimeZone(TimeZone.getTimeZone("GMT")); Date uploadDate = f.getUploadDate(); String lastModified = df.format(uploadDate); if(modifiedSince != null){ Date modifiedDate = null; Date sinceDate = null; try{ modifiedDate = df.parse(lastModified); sinceDate = df.parse(modifiedSince); }catch(ParseException e){ System.out.println(e.getMessage()); } if(modifiedDate.compareTo(sinceDate) <= 0){ response.setStatus(304); //Not Modified return; } } long maxAge = 10L 365L 24L 60L 60L; //ten years, in seconds response.setHeader("Cache-Control", "max-age=" + maxAge); response.setHeader("Last-Modified", lastModified); response.setDateHeader("Expires", uploadDate.getTime() + maxAge * 1000L); }else{ response.setHeader("Pragma","no-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires", 0); } f.writeTo(response.getOutputStream()); } }

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

}</pre>

 

可以通過FileCtrl來獲取,在web.xml中配置如下:

 <servlet>
     <servlet-name>files</servlet-name>
     <servlet-class>FileCtrl</servlet-class>
 </servlet>
 <servlet-mapping>
     <servlet-name>files</servlet-name>
     <url-pattern>/files/*</url-pattern>
 </servlet-mapping> 

 

外部ie訪問url: http://127.0.0.1:8080/files/hqsb/2012-02-02/20120224第一版.pdf

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!