`
ylz4647
  • 浏览: 50062 次
  • 性别: 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读取局域网共享文件,主要涉及以下步骤和知识点: 1. **网络路径表示**:Java中,网络路径通常以UNC(Universal Naming Convention)格式表示,形如`\\hostname\shared_directory\file.txt`。这里`...

    java 局域网文件共享程序

    Java 局域网文件共享程序是一种利用Java编程语言开发的应用,旨在实现局域网内的文件共享、下载以及聊天功能。这种程序通常通过网络编程技术,如Socket编程和多线程处理,来实现在同一网络环境下的设备间进行高效的...

    通过IP获取局域网计算机共享文件列表

    标题"通过IP获取局域网计算机共享文件列表"揭示了我们需要利用特定的技术手段来探测并列举出局域网内指定IP地址计算机上开放的共享资源。以下将详细阐述这个过程涉及的知识点: 1. **网络编程基础**:首先,理解...

    JAVA实现局域网桌面共享

    接下来,我们将深入探讨JAVA实现局域网桌面共享的相关知识点。 首先,JAVA是一种广泛使用的跨平台编程语言,它的网络编程能力强大,适合处理局域网内的通信问题。实现桌面共享,关键在于创建一个服务器端应用,用于...

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

    `SmbUtils.java`中的某个方法可能负责从共享目录读取文件内容,并通过文件流将其写入到本地目录。 4. **身份验证**: - 如果访问的共享目录需要密码,`CmdUtils.java`可能会包含处理Windows命令行身份验证的逻辑,...

    java局域网文件传输

    在IT领域,尤其是在Java编程中,局域网文件传输是一个常见的需求,比如在多台设备间共享文件或者在分布式系统中传递数据。本项目聚焦于使用Java实现这一功能,通过局域网(LAN)实现文件的高效、安全传输。下面我们...

    java局域网内的文件传输

    在IT行业中,文件传输是一项基础且重要的功能,尤其是在局域网环境内,高效、安全的文件传输对于工作协同和资源共享至关重要。本项目标题为“Java局域网内的文件传输”,这意味着我们将探讨如何利用Java编程语言在...

    实现局域网文件传输的java源码

    在Java编程环境中,实现局域网文件传输是一项常见的任务,特别是在多台设备间共享数据时。这个场景下,我们有两个核心文件:`SimpleServer.java`和`SimpleClient.java`,分别代表服务器端和客户端的实现。 首先,让...

    java 局域网拷贝文件

    在Java编程环境中,实现局域网内的文件拷贝是一项常见的任务,尤其对于系统集成、数据共享或备份场景。本文将详细讲解如何利用Java技术来复制局域网内其他计算机上的文件,并讨论如何替换文件调用路径片段以适应不同...

    java局域网文件传输源码

    Java局域网文件传输源码是一个实用的编程项目,它允许用户在局域网内的设备之间分享文件。这个项目基于Java编程语言实现,利用了Java的网络通信功能,为开发者提供了一个基础的文件共享和传输的框架。下面将详细介绍...

    简单的局域网文件传输java代码

    标题中的“简单的局域网文件传输java代码”指的是利用Java编程语言实现的一种基本的局域网内文件传输功能。在局域网环境下,文件传输通常用于共享数据或协同工作,而Java提供了网络通信所需的类库,使得开发这样的...

    Java版局域网通信软件

    Java版局域网通信软件是一种基于Java编程语言开发的应用,旨在提供类似飞秋的功能,用于在局域网内的计算机之间实现高效、便捷的通信。这款软件涵盖了多种实用特性,包括个人私聊、群发信息、单个及多个文件传输、...

    单机版本QQ,可以实现局域网内的聊天功能

    本篇将详细探讨一个特别的应用场景——单机版本的QQ,该版本专注于局域网内的聊天功能,通过巧妙地运用线程技术和文件读取功能,为用户提供了一种无需互联网连接即可进行通信的新方式。 首先,我们要理解“单机版本...

    java写的局域网聊天室,tcp协议

    利用Java语言构建局域网聊天室,不仅能够实现基本的文本消息传输功能,还能在此基础上扩展多媒体数据交换、文件共享等多种高级应用。本文章将详细解析由Java编写的局域网聊天室源码,主要聚焦于其使用的TCP协议,并...

    Java 开发JAVA局域网飞鸽传书软件设计与实现(源代码+论文).rar

    这种软件通常允许用户在同一个网络环境下快速、便捷地共享文件,而无需依赖外部互联网服务。以下是基于这个主题可能涉及的一些关键知识点: 1. **Java编程基础**:Java是一种跨平台的面向对象编程语言,它的“一次...

    局域网传送文件Java实现(Server端)

    本文将深入探讨如何使用Java在局域网内实现文件传输,主要关注Server端的实现。这个程序提供了一种高效且安全的方式,使得在同一网络中的设备能够相互交换文件。 首先,我们需要了解局域网(LAN,Local Area ...

    局域网广播系统{java源码}

    5. **文件传输**:如果局域网广播系统涉及到文件共享,那么需要使用流I/O(InputStream和OutputStream)来读取和写入文件。FileInputStream和FileOutputStream是常用的文件操作类,而DataInputStream和...

    实现局域网里文件传输

    在IT行业中,局域网(LAN)内的文件传输是一个常见的需求,特别是在共享资源或协作工作时。本项目涉及的关键技术是使用SOCKET网络编程来实现这一功能。SOCKET是网络通信的基本组件,允许应用程序通过Internet或...

Global site tag (gtag.js) - Google Analytics