近日在试用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
分享到:
相关推荐
java 读取局域网机器上共享文件,以经过测试。
要实现Java读取局域网共享文件,主要涉及以下步骤和知识点: 1. **网络路径表示**:Java中,网络路径通常以UNC(Universal Naming Convention)格式表示,形如`\\hostname\shared_directory\file.txt`。这里`...
Java 局域网文件共享程序是一种利用Java编程语言开发的应用,旨在实现局域网内的文件共享、下载以及聊天功能。这种程序通常通过网络编程技术,如Socket编程和多线程处理,来实现在同一网络环境下的设备间进行高效的...
标题"通过IP获取局域网计算机共享文件列表"揭示了我们需要利用特定的技术手段来探测并列举出局域网内指定IP地址计算机上开放的共享资源。以下将详细阐述这个过程涉及的知识点: 1. **网络编程基础**:首先,理解...
接下来,我们将深入探讨JAVA实现局域网桌面共享的相关知识点。 首先,JAVA是一种广泛使用的跨平台编程语言,它的网络编程能力强大,适合处理局域网内的通信问题。实现桌面共享,关键在于创建一个服务器端应用,用于...
`SmbUtils.java`中的某个方法可能负责从共享目录读取文件内容,并通过文件流将其写入到本地目录。 4. **身份验证**: - 如果访问的共享目录需要密码,`CmdUtils.java`可能会包含处理Windows命令行身份验证的逻辑,...
在IT领域,尤其是在Java编程中,局域网文件传输是一个常见的需求,比如在多台设备间共享文件或者在分布式系统中传递数据。本项目聚焦于使用Java实现这一功能,通过局域网(LAN)实现文件的高效、安全传输。下面我们...
在IT行业中,文件传输是一项基础且重要的功能,尤其是在局域网环境内,高效、安全的文件传输对于工作协同和资源共享至关重要。本项目标题为“Java局域网内的文件传输”,这意味着我们将探讨如何利用Java编程语言在...
在Java编程环境中,实现局域网文件传输是一项常见的任务,特别是在多台设备间共享数据时。这个场景下,我们有两个核心文件:`SimpleServer.java`和`SimpleClient.java`,分别代表服务器端和客户端的实现。 首先,让...
在Java编程环境中,实现局域网内的文件拷贝是一项常见的任务,尤其对于系统集成、数据共享或备份场景。本文将详细讲解如何利用Java技术来复制局域网内其他计算机上的文件,并讨论如何替换文件调用路径片段以适应不同...
Java局域网文件传输源码是一个实用的编程项目,它允许用户在局域网内的设备之间分享文件。这个项目基于Java编程语言实现,利用了Java的网络通信功能,为开发者提供了一个基础的文件共享和传输的框架。下面将详细介绍...
标题中的“简单的局域网文件传输java代码”指的是利用Java编程语言实现的一种基本的局域网内文件传输功能。在局域网环境下,文件传输通常用于共享数据或协同工作,而Java提供了网络通信所需的类库,使得开发这样的...
Java版局域网通信软件是一种基于Java编程语言开发的应用,旨在提供类似飞秋的功能,用于在局域网内的计算机之间实现高效、便捷的通信。这款软件涵盖了多种实用特性,包括个人私聊、群发信息、单个及多个文件传输、...
本篇将详细探讨一个特别的应用场景——单机版本的QQ,该版本专注于局域网内的聊天功能,通过巧妙地运用线程技术和文件读取功能,为用户提供了一种无需互联网连接即可进行通信的新方式。 首先,我们要理解“单机版本...
利用Java语言构建局域网聊天室,不仅能够实现基本的文本消息传输功能,还能在此基础上扩展多媒体数据交换、文件共享等多种高级应用。本文章将详细解析由Java编写的局域网聊天室源码,主要聚焦于其使用的TCP协议,并...
这种软件通常允许用户在同一个网络环境下快速、便捷地共享文件,而无需依赖外部互联网服务。以下是基于这个主题可能涉及的一些关键知识点: 1. **Java编程基础**:Java是一种跨平台的面向对象编程语言,它的“一次...
本文将深入探讨如何使用Java在局域网内实现文件传输,主要关注Server端的实现。这个程序提供了一种高效且安全的方式,使得在同一网络中的设备能够相互交换文件。 首先,我们需要了解局域网(LAN,Local Area ...
5. **文件传输**:如果局域网广播系统涉及到文件共享,那么需要使用流I/O(InputStream和OutputStream)来读取和写入文件。FileInputStream和FileOutputStream是常用的文件操作类,而DataInputStream和...
在IT行业中,局域网(LAN)内的文件传输是一个常见的需求,特别是在共享资源或协作工作时。本项目涉及的关键技术是使用SOCKET网络编程来实现这一功能。SOCKET是网络通信的基本组件,允许应用程序通过Internet或...