package com.byd.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.tools.zip.ZipOutputStream;
import com.byd.core.BaseAction;
import com.byd.core.MyUtils;
import com.byd.Page;
import com.byd.bean.MyFile;
@SuppressWarnings("serial")
public class FileAction extends BaseAction {
public static final String ROOT = "root\\";
private File myUpload;
private String myUploadContentType;
private String myUploadFileName;
private String path;
private String node;
private List nodes;
private Page page;
private String name;
private String[] paths;
private boolean success;
/**
* 处理中文下载名
*
* @return
* @throws UnsupportedEncodingException
*/
public String getDownloadFileName() throws UnsupportedEncodingException {
String named = new String(name.getBytes("ISO8859-1"),"utf-8" );
return named;
}
/**
* 获得文件下载流
*
* @return
* @throws FileNotFoundException
*/
public InputStream getInputStream() throws FileNotFoundException {
try{
return getServletContext().getResourceAsStream(ROOT + path + "/" + getDownloadFileName());
}catch(Exception ex){
ex.printStackTrace();
}
return null;
}
/**
* 下载文件
*
* @return
*/
public String download() {
return SUCCESS;
}
/**
* 解压缩文件
*
* @return
*/
public String decompressionFiles() {
String rootPath = getSession().getServletContext().getRealPath("/");
rootPath += ROOT;
File file = new File(rootPath);
if(!file.exists()){
file.mkdirs();
}
file = null;
String extName, toPath, absPath;
boolean flag = false;
try {
for (String path : paths) {
file = new File(rootPath + path);
if (file.isDirectory()) {
continue;
}
extName = path.substring(path.lastIndexOf(".") + 1).toLowerCase();
toPath = rootPath + (((getPath() != null) && (getPath().length() > 0)) ? getPath().substring(1) : "")
+ "\\";
absPath = file.getAbsolutePath();
if ("zip".equals(extName)) {
flag = MyUtils.decompressionZipFiles(absPath, toPath);
} else if ("rar".equals(extName)) {
flag = MyUtils.decompressionRarFiles(absPath, toPath);
}
}
} catch (RuntimeException e) {
flag = false;
e.printStackTrace();
} finally {
file = null;
}
setSuccess(flag);
return SUCCESS;
}
/**
* 多文件下载
*
* @throws IOException
*/
public String downloadAll() throws IOException {
// String rootPath = getSession().getServletContext().getRealPath("/");
return SUCCESS;
}
// public InputStream getZipInputStrean() throws IOException {
// String rootPath = getSession().getServletContext().getRealPath("/");
// ZipOutputStream zosm = null;
// FileOutputStream fosm = null;
// File file = null;
// String zipName = "Untitled.zip";
//
// fosm = new FileOutputStream(rootPath + getPath() + "\\" + zipName);
// zosm = new ZipOutputStream(fosm);
// for (String path : paths) {
// file = new File(rootPath + path);
// MyUtils.compressionFiles(zosm, file, getPath());
// file = null;
// }
// return MyUtils.getZipInputStrean(zosm, file, getPath());
// }
/**
* 多文件压缩
*
* @return
* @throws IOException
*/
public String compressionFiles() throws IOException {
String rootPath = getSession().getServletContext().getRealPath("/");
rootPath += ROOT;
File filed = new File(rootPath);
if(!filed.exists()){
filed.mkdirs();
}
filed = null;
ZipOutputStream zosm = null;
FileOutputStream fosm = null;
File file = null;
try {
String zipName = "Untitled.zip";
if (getPaths().length > 0) {
String tempName = getPaths()[0];
int start = tempName.lastIndexOf("\\");
if (start != -1) {
tempName = tempName.substring(start + 1);
}
zipName = tempName + ".zip";
zipName = MyUtils.checkFileName(zipName, rootPath + getPath() + "\\");
}
fosm = new FileOutputStream(rootPath + getPath() + "\\" + zipName);
zosm = new ZipOutputStream(fosm);
for (String path : paths) {
file = new File(rootPath + path);
MyUtils.compressionFiles(zosm, file, getPath());
file = null;
}
setSuccess(true);
} catch (IOException e) {
setSuccess(false);
e.printStackTrace();
throw e;
} finally {
file = null;
if (zosm != null) {
zosm.close();
}
if (fosm != null) {
fosm.close();
}
}
return SUCCESS;
}
/**
* 多文件删除
*
* @return
*/
public String deleteFiles() {
String rootPath = getSession().getServletContext().getRealPath("/");
rootPath += ROOT;
File file = new File(rootPath);
if(!file.exists()){
file.mkdirs();
}
file = null;
boolean flag = false;
try {
for (String path : paths) {
file = new File(rootPath + path);
flag = MyUtils.delFiles(file);
if (!flag) {
break;
}
}
} catch (RuntimeException e) {
flag = false;
e.printStackTrace();
} finally {
file = null;
}
setSuccess(flag);
return SUCCESS;
}
/**
* 创建文件夹
*
* @return
*/
public String createFolder() {
String rootPath = getSession().getServletContext().getRealPath("/");
rootPath += ROOT;
String createPath = rootPath + getPath() + "/";
setSuccess(MyUtils.mkDirectory(createPath + getName()));
return SUCCESS;
}
/**
* 上传文件
*
* @return
*/
public String uploadFiles() {
String rootPath = getSession().getServletContext().getRealPath("/");
rootPath += ROOT;
String sp = rootPath + getPath();
MyUtils.mkDirectory(sp);
setSuccess(MyUtils.upload(getMyUploadFileName(), sp, getMyUpload()));
return SUCCESS;
}
/**
* 2008-12-18-下午02:00:17
*
* 功能:获得指定目录下的所有目录信息
*
* @return
* @throws IOException
* @throws FileNotFoundException
*/
@SuppressWarnings("unchecked")
public String getDirectories() throws FileNotFoundException, IOException {
String rootPath = getSession().getServletContext().getRealPath("/");
rootPath += ROOT;
File file = new File(rootPath);
if(!file.exists()){
file.mkdirs();
}
file = null;
nodes = listFiles(rootPath, node, true);
return SUCCESS;
}
/**
* 2008-12-18-下午04:52:19
*
* 功能:获得指定路径下大所有文件和文件夹信息,把数据封装到nodes返回
*
* @param folder
* 当前要访问的文件夹目录名称
* @param onlyDirectory
* null:获得所有信息,true:只获得文件夹,false:只获得文件信息
* @return
* @throws IOException
* @throws FileNotFoundException
*/
@SuppressWarnings("unchecked")
private List listFiles(String rootPath, String folder, boolean onlyDirectory) throws FileNotFoundException,
IOException {
List filelist = new ArrayList();
File[] arrFiles = new File(rootPath + folder).listFiles();
MyFile nd = null;
if (arrFiles != null) {
for (File f : arrFiles) {
String id = f.getAbsolutePath();
nd = new MyFile();
nd.setId(id.substring(rootPath.length()));
nd.setText(f.getName());
nd.setLeaf(f.isFile());
nd.setFileName(f.getName());
if (f.isFile()) {
int size = new FileInputStream(f).available();
if (size > 1024) {
nd.setFileSize((size / 1000f) + " KB");
} else {
nd.setFileSize(size + " bytes");
}
} else {
nd.setFileSize("0 bytes");
}
nd.setLastModifyDate(new Date(f.lastModified()));
if (onlyDirectory && !f.isDirectory()) {
continue;
}
filelist.add(nd);
}
}
return filelist;
}
/**
* 2008-12-18-下午05:17:38
*
* 功能:获得指定文件夹下面的所有文件和文件夹信息
*
* @return
* @throws IOException
* @throws FileNotFoundException
*/
public String getFiles() throws FileNotFoundException, IOException {
String rootPath = getSession().getServletContext().getRealPath("/");
rootPath += ROOT;
File file = new File(rootPath);
if(!file.exists()){
file.mkdirs();
}
file = null;
page = new Page();
node = node == null ? "" : node;
page.setRoot(this.listFiles(rootPath, node, false));
int length = new File(rootPath + node).list().length;
page.setTotalProperty(length);
return SUCCESS;
}
public String getNode() {
return node;
}
public void setNode(String node) {
this.node = node.equals("*") ? "" : node; // 处理根结点特殊id
}
public List getNodes() {
return nodes;
}
public void setNodes(List files) {
this.nodes = files;
}
public Page getPage() {
return page;
}
public void setPage(Page page) {
this.page = page;
}
public String getPath() {
return path;
}
public void setPath(String path) throws UnsupportedEncodingException {
this.path = URLDecoder.decode(path, "UTF-8");
}
public File getMyUpload() {
return myUpload;
}
public void setMyUpload(File myUpload) {
this.myUpload = myUpload;
}
public String getMyUploadContentType() {
return myUploadContentType;
}
public void setMyUploadContentType(String myUploadContentType) {
this.myUploadContentType = myUploadContentType;
}
public String getMyUploadFileName() {
return myUploadFileName;
}
public void setMyUploadFileName(String myUploadFileName) {
this.myUploadFileName = myUploadFileName;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getName() {
return name;
}
public void setName(String fileName) throws UnsupportedEncodingException {
this.name = URLDecoder.decode(fileName, "UTF-8");
}
public String[] getPaths() {
return paths;
}
public void setPaths(String[] names) {
this.paths = names;
}
}
<include file="struts-default.xml" />
<package name="simple" extends="struts-default">
<action name="download" class="fileAction" method="download">
<result name="success" type="stream">
<param name="contentType">application/octet-stream;charset=ISO8859-1</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
<param name="bufferSize">4096</param>
</result>
</action>
</package>