Domino servlet下载附件

Domino通过url打开附件内容方法

1)http://xxx.yyy/abc.nsf/0/1A97B5BBA75AF8FC48257CAF00248EE4/$FILE/ls调用java.doc

   方法有个情况,如果是pdf或插件直接浏览器打开。

2)通过servlet打开,避免了方法1的打开问题。

js打开方法

window.open('/servlet/DownUrl?filePath='+encodeURI(filename)+'&dbpath='+dbpath+'&unid='+unid+'&num=0&id='+Math.random());

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Enumeration;
import java.util.Vector;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import lotus.domino.Database;
import lotus.domino.Document;
import lotus.domino.EmbeddedObject;
import lotus.domino.NotesException;
import lotus.domino.NotesFactory;
import lotus.domino.NotesThread;
import lotus.domino.RichTextItem;
import lotus.domino.Session;


public class DownUrl extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		this.doPost(request, response);
	}

	//num  1为servlet动态添加,0为原文档
	//window.open('/servlet/DownUrl?filePath='+encodeURI(filename)+'&dbpath='+dbpath+'&unid='+unid+'&num='+num+'&id='+Math.random());
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		  String num=request.getParameter("num");             //1为servlet动态添加,0为原文档 
		  String filePath = request.getParameter("filePath");  //文件名称 
		  String dbpath= request.getParameter("dbpath");      //数据库路径 
		  String unid= request.getParameter("unid");		  //文档unid
		  if (filePath != null && num!=null) {
		   //System.out.println("URLDecode filePath="+URLDecoder.decode(request.getParameter("filePath"), "UTF-8"));
		   filePath = new String(request.getParameter("filePath").getBytes("ISO-8859-1"), "utf-8");
		   System.out.println("filePath="+filePath);
		   dbpath= new String(request.getParameter("dbpath").getBytes("ISO-8859-1"), "utf-8");
		   System.out.println("dbpath-->"+dbpath);
		   unid= new String(request.getParameter("unid").getBytes("ISO-8859-1"), "utf-8");
		   System.out.println("unid-->"+unid); 
		   num= new String(request.getParameter("num").getBytes("ISO-8859-1"), "utf-8");
		  }else{
		   response.setContentType("text/html;charset=GBK");
		   response.getWriter().print("<script>alert('请求参数错误!');javascript:history.go(-1);</script>");
		   return;
		  }
		  String mainPath = gethj()+"/domino/html/attached/";
		  System.out.println("mainPath="+mainPath);
		  //downLoadFromUrl(filePath,getFileName(filePath),mainPath);	
		  String path=mainPath+filePath;
		  try {
			//如果为原文档提供附件
			  if(num.equals("0")){
				  SaveFile( dbpath,unid,path);
			  }			
		} catch (NotesException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		  
		  //String path=filePath;		  
		  //path="D:/jscss.rar";
		  File file =new File(path);
		  //File file3 = new File("D:/jscss.rar"); 
		  System.out.println(file.getAbsolutePath());
		  
		  if(path.equals("")){
		   System.out.println("文件不存在!");
		   response.setContentType("text/html;charset=GBK");
		   response.getWriter().print("<script>alert('文件不存在!');</script>");
		   //response.getWriter().print("<script>window.opener.close();</script>");
		   response.getWriter().print("<script>javascript:history.go(-1);</script>");
		   return;
		  }else{
		   downloadFile(path, getFileName(path), response,num);
		  }
		  	 
	}
	
	/*
	 *  num //1为servlet动态添加,0为原文档 
	 */
	private static void downloadFile(String filePath, String fileName,
			HttpServletResponse response,String num) throws IOException {
		  //设置响应头和保存文件名 
		  response.setContentType("APPLICATION/OCTET-STREAM;charset=gbk");
		//  response.setContentType("application/x-msdownload");
		  response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
		 
		  BufferedInputStream bis=null;
		  BufferedOutputStream bos=null;
		  try{
			 
		  
		  ServletOutputStream sos=response.getOutputStream();
		  bis=new BufferedInputStream(new FileInputStream(filePath));
		  //bis=new BufferedInputStream(inputStream);
		  bos=new BufferedOutputStream(sos);
		  
		  byte[] buffer=new byte[4096];
		  int byteread;
		  while(-1!=(byteread=bis.read(buffer,0,buffer.length))){
		   bos.write(buffer, 0, byteread);
		  }
	
		  }catch(IOException e){
		   e.printStackTrace();
		  }finally{
		   if(bis!=null){
		    bis.close();
		   }
		   if(bos!=null){
		    bos.close();
		   }
		   System.out.println("关闭流!");
		  }
		  System.out.println("文件下载完毕.");
		//如果为原文档提供附件
		  if(num.equals("0")){
			  deleteFile(filePath);
		  }		  
		 }
	
	//截取文件名称
	 private String getFileName(String filePath){
	  int  index1=filePath.lastIndexOf("/");
	  int  index2=filePath.lastIndexOf("\\");
	  int index=(index1>index2)?index1:index2;
	  return filePath.substring(index+1);
	 }
	 
	 /** 
     * 从输入流中获取字节数组 
     * @param inputStream 
     * @return 
     * @throws IOException 
     */  
    public static  byte[] readInputStream(InputStream inputStream) throws IOException {    
        byte[] buffer = new byte[1024];    
        int len = 0;    
        ByteArrayOutputStream bos = new ByteArrayOutputStream();    
        while((len = inputStream.read(buffer)) != -1) {    
            bos.write(buffer, 0, len);    
        }    
        bos.close();    
        return bos.toByteArray();    
    } 
    
    
    
    /**
	 * 从网络Url中下载文件
	 * @param urlStr
	 * @param fileName
	 * @param savePath
	 * @throws IOException
	 */
	public static void  downLoadFromUrl(String urlStr,String fileName,String savePath) throws IOException{
		URL url = new URL(urlStr);  
		HttpURLConnection conn = (HttpURLConnection)url.openConnection();  
                //设置超时间为3秒
		conn.setConnectTimeout(3*1000);
		//防止屏蔽程序抓取而返回403错误
		conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
 
		//得到输入流
		InputStream inputStream = conn.getInputStream();  
		//获取自己数组
		byte[] getData = readInputStream(inputStream);    
 
		//文件保存位置
		File saveDir = new File(savePath);
		if(!saveDir.exists()){
			saveDir.mkdir();
		}
		File file = new File(saveDir+File.separator+fileName);    
		FileOutputStream fos = new FileOutputStream(file);     
		fos.write(getData); 
		if(fos!=null){
			fos.close();  
		}
		if(inputStream!=null){
			inputStream.close();
		}
 
 
		System.out.println("info:"+url+" download success"); 
 
	}
	
	public String gethj(){		
	    try {
	    	//创建NotesThread对象
		    NotesThread.sinitThread(); 
		    //创建新会话对象
			Session session = NotesFactory.createSession();	
			String temp= session.getEnvironmentString("Directory", true);
			session.recycle();
			return temp;
		} catch (NotesException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("操作异常");
		    System.out.println(e.toString());
		    return "";
		}  
		 finally
	      {
	        NotesThread.stermThread();
	      }
	}
 
	
	/**
	 * 
	 * @param dbpath 数据库路径
	 * @param unid 文档unid
	 * @param filepath 文件完整路径
	 * @throws NotesException
	 */
	public void SaveFile(String dbpath,String unid,String filepath) throws NotesException{
		NotesThread.sinitThread(); 
		Session session = NotesFactory.createSession();  
		System.out.println("1111");
		Database db = session.getDatabase("", dbpath);
		System.out.println("unid-->"+unid);
	    System.out.println("database-->"+db.getFileName());
	
	    Document doc =  db.getDocumentByUNID(unid);
	    System.out.println("doc-->"+doc.getUniversalID());
	    RichTextItem body = (RichTextItem) doc.getFirstItem("Body");
        if (body != null) {

        	//如果新旧附件同名
        	
        		 System.out.println("进入附件名称与新附件名称相同-->");
		          Vector v = body.getEmbeddedObjects();
		          Enumeration e = v.elements();
		          
		          while (e.hasMoreElements()) {
		            EmbeddedObject eo = (EmbeddedObject) e.nextElement();
		            if (eo.getType() == EmbeddedObject.EMBED_ATTACHMENT) {		            		//判断 有同样的附件
		            	System.out.println("eo.getName()附件名称-->"+eo.getName());			              
		            	//eo.remove();
		            	deleteFile(filepath);
		            	eo.extractFile(filepath);
			            break;
		            }
		          }
		          /*while结束*/
        	}else{
        		System.out.println("文档没有对应的Body富域,建议附件文档时,附件在富域Body里面!");
        	}
        //回收对象
        db.recycle();
        session.recycle();
        NotesThread.stermThread();
	}
	
	 /**
     * 删除单个文件
     * @param   sPath    被删除文件的文件名
     * @return 单个文件删除成功返回true,否则返回false
     */
    public static boolean deleteFile(String sPath) {
       boolean flag = false;
       File file = new File(sPath);
        // 路径为文件且不为空则进行删除
        if (file.isFile() && file.exists()) {
            file.delete();
            flag = true;
        }
        return flag;
    }
 
	

}

参考:

https://blog.csdn.net/woshiwxw765/article/details/6653476

发布了76 篇原创文章 · 获赞 17 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/weijia3624/article/details/81746805