`
ylz4647
  • 浏览: 48700 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Java直接读取局域网内共享文件

    博客分类:
  • Java
阅读更多

近日在试用jcifs_1.3.8 实现Java直接读取局域网内共享文件,其实现就像Linux下的SMB协议,感觉挺方便的~ 可是在实现文件下载时发生了一个奇怪的情况:Txt文件可以正常下载,但是多会了几行空行在前面,而其他文件(如Excle)等则会损坏,结果发现是JSP中换行的问题,现在把实验贴上来以防忘记,顺便与大家分享  ^^


    1. 下载 jcifs-1.3.8.jar

    2. 测试JSP:  

<%@ page language="java" pageEncoding="UTF-8"
	contentType="text/html; charset=UTF-8" import="jcifs.smb.*,java.io.*,java.util.*,
	java.net.URLEncoder,java.net.URLDecoder"

%><%!  // --------不能有空行

	public java.util.List getFileList(String url){
		try {			
			SmbFile sf = new SmbFile(url);			
			if(sf!=null){
				
				/*// 仅过滤文件
				SmbFile[] files = sf.listFiles(new SmbFilenameFilter(){
					public boolean accept(SmbFile dir, String name) throws SmbException {						
						return name.endsWith(".txt");
					}					
				});	*/			
				SmbFile[] files = sf.listFiles();			
				
				if (files != null) {
					java.util.List list = new ArrayList(); 
					for (int i = 0; i < files.length; i++){
						Map map = new HashMap();
						map.put("name", URLEncoder.encode(files[i].getName(),"UTF-8"));
						map.put("recordurlall", URLEncoder.encode(files[i].getURL().toString(),"UTF-8"));
						list.add(map);					
					}
					return list;
				}
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public byte[] getFile(String url){
		SmbFileInputStream in = null;
		try {
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			in = new SmbFileInputStream(url); // 建立smb文件輸入流			
			byte buffer[] = new byte[4096];	        
	        for(int n = 0; (n = in.read(buffer))>0;){
	            out.write(buffer, 0, n);	            
	        }
	        return out.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
		} finally{						
			try {
				if (in != null)
					in.close();
			} catch (IOException e) {
			}
		}
		return null;
	}
	public byte[] getFile2(String url){
		SmbFileInputStream in = null;
		try {
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			SmbFile sf = new SmbFile(url); // 建立smb文件輸入流
			in = new SmbFileInputStream(sf);			
			byte[] b = new byte[4096];
	    	int n;
	    	while(( n = in.read( b )) > 0 ) {	    	    
	    	    out.write(b, 0, n);
	    	}
	        return out.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
		} finally{						
			try {
				if (in != null)
					in.close();
			} catch (IOException e) {
			}
		}
		return null;
	}
	public void print(String fileName, HttpServletResponse response, byte[] destFiles) throws Exception{
		//檔案名稱
		String encodeFileName = java.net.URLEncoder.encode(fileName, "UTF-8");		
		if(fileName.endsWith(".xls"))
			response.setContentType("application/vnd.ms-excel");
		else
			response.setContentType("text/plain");

		//加上下列兩行才可開啟檔案
		//response.setHeader("Pragma", "");
		//response.setHeader("Cache-Control", "");
		//response.setHeader("Content-Disposition", "inline; filename=" + encodeFileName + ";"); //直接開啟檔案

		response.setHeader("Content-Disposition","attachment; filename=" + encodeFileName + ";"); //另存新檔

		InputStream is = null;
		javax.servlet.ServletOutputStream out = null;
		try {			
			is = new ByteArrayInputStream(destFiles);
			out = response.getOutputStream();
			byte buffer[] = new byte[4096];
			response.flushBuffer();			
	        for(int n = 0; -1 != (n = is.read(buffer));){
	            out.write(buffer, 0, n);
	        }
		} finally {
			is.close();			
		}		
	}
	
%><%   // --------不能有空行

	String type = request.getParameter("type");

	if ("1".equals(type)) {
		String url = URLDecoder.decode(request.getParameter("url"),"UTF-8");
		if (url != null && !"".equals(url)) {
		String name = URLDecoder.decode(request.getParameter("name"),"UTF-8");
		byte[] file = getFile2(url);
		if (file != null) {
			print(name, response, file);
		}
		}
	} else {
		java.util.List files = getFileList("smb://账号:密码@主机名或IP/Temp/");
		if (files != null) {
			out.println("<table border='1'>");
			Map data = null;
			for (int i = 0; i < files.size(); i++) {
				data = (Map) files.get(i);
				out.println("<tr><td><a target='dataframe' href='"
				+ request.getContextPath()
				+ "/smb.jsp?type=1&url="
				+ data.get("recordurlall") + "&name="
				+ data.get("name") + "'>" + URLDecoder.decode((String)data.get("name"),"UTF-8")
				+ "</a><td></tr>");
			}
			out.println("</table>");
			out.println("<iframe name='dataframe' width='0' height='0'></iframe>");
		}
	}
%>

 

3. 效果如下图: 


 

   注意: 为了保证下载文件不损坏,在JSP中的<%...%><%...%>之间不能有任何换行或空白,否则就会出现多出了些空行从而导致源文件损坏,当然如果用Servlet或 Struts等Java端实现就不会存在这样的问题……

 

  • 大小: 11 KB
分享到:
评论
3 楼 ylz4647 2011-07-08  
bean5618 写道
读linux下文件,总是连接失败,是否需要目录权限

这个你可能要先用网上邻居的方式去尝试访问一下,看是否可以操作,如果没有问题就不存在权限问题,至于URL都是一样的,你可以再试试看,我已好久没上这了,真不好意思!
2 楼 bean5618 2011-06-16  
读linux下文件,总是连接失败,是否需要目录权限
1 楼 bean5618 2011-06-16  
请教下,url怎么写的?

相关推荐

    java读取局域网共享机器文件

    java读取局域网共享机器文件 java读取局域网共享机器文件

    java 读取局域网机器上共享文件

    java 读取局域网机器上共享文件,以经过测试。

    java读取win共享文件夹

    使用java读取局域网中window共享文件夹下内容保存到本地

    超详细!java访问windows共享目录并下载文件

    java调用cmd命令实现访问windows共享目录(需不需要密码均可),然后根据指定文件路径下载文件到我们自己配置的本地目录,main函数为测试代码

    JAVA上百实例源码以及开源项目

    (1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,...

    java源码包---java 源码 大量 实例

    (1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,...

    java源码包4

    (1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,...

    java源码包3

    (1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,...

    JAVA上百实例源码以及开源项目源代码

    (1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,...

    java源码包2

    (1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...

    写入共享盘任意格式数据

    搭建好局域网,设置某个文件夹共享,即可通过java文件进行写入任意格式的数据,到共享文件夹中

    java 面试题 总结

    forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 redirect...

    超级有影响力霸气的Java面试题大全文档

     forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    而JSP的组件是用Java开发的,可以直接使用; 4、一次编写,处处运行:作为JAVA开发平台的一部分,JSP具有JAVA的所有优点,包括Write once , Run everywhere. 3.2. 数据库的选择 3.2.1. Web应用程序开发环境—SQL...

Global site tag (gtag.js) - Google Analytics