文件服务器操作工具类

import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.struts2.ServletActionContext;

/**
 * 文件服务器操作工具类 负责与文件服务器通信,并进行上传、下载等操作
 * 
 * @author hzp
 * 
 */
public class FileSystem {

	
	// 加载文件服务器相关配置信息

	private static InputStream in = FileSystem.class.getClassLoader().getResourceAsStream("fileSystem.properties");
	private static Properties p = new Properties();

	// 服务器的url前缀(ip与端口)
	//private static String path = "http://localhost:"+ ServletActionContext.getRequest().getLocalPort();
	private static String path=getDomainName();
		
	//获取文件服务器域名

	private static String getDomainName(){
		String root=null;
		try {
			p.load(in);
			//获取配置里的文件服务器域名

			root=p.getProperty("file_domain_name");
		} catch (IOException e) {
			e.printStackTrace();
		}
		//当配置文件没有配置域名信息时,动态获取当前容器的域名
		if(true==StringUtils.isEmpty(root)){
			root="http://localhost:"+ ServletActionContext.getRequest().getLocalPort();
		}
		return root;
	}

	// 获取文件服务器文件存放的路径
	public static String getFileSystemFileRootPath() throws Exception {
		p.load(in);
		String root = path + p.getProperty("file_root_path");
		return root;
	}

	// 获取文件服务器文件上传servlet的路径

	public static String getFileSystemUploadServletPath() throws Exception {
		p.load(in);
		String root = path + p.getProperty("upload_servlet");
		return root;
	}

	// 获取文件服务器文件下载servlet的路径

	public static String getFileSystemDownloadServletPath() throws Exception {
		p.load(in);
		String root = path + p.getProperty("download_servlet");
		return root;
	}
	
	
	
	/**
	 * 获取文件后缀
	 * 
	 * 从文件名中获取文件后缀,获取后的后缀形式形如:“.txt”、“.jpg”等,并且后缀全部转换为小写字母。<br/>
	 * 另外:如果文件没有后缀名,则返回一个空字符串;如果文件名为空,则返回null。

	 * @param fileName 文件名

	 * 
	 * @return postfix 文件后缀
	 */
	public static String getFilePostfix(String fileName) {
		String postfix = null;
		if (StringUtils.isEmpty(fileName)) {
			return postfix;
		}
		fileName = fileName.trim();
		int pos = fileName.lastIndexOf(".");
		if (pos == -1) {
			postfix = "";
			return "";
		} else {
			postfix = fileName.substring(pos).toString().toLowerCase();
		}
		return postfix;
	}
	
	//生成指定长度的随机字符串
	public static String getRandomString(int length) {
		if (length <= 0) {
			return "";
		}
		char[] randomChar = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd',
				'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm' };
		Random random = new Random();
		StringBuffer stringBuffer = new StringBuffer();
		for (int i = 0; i < length; i++) {
			stringBuffer.append(randomChar[Math.abs(random.nextInt()) % randomChar.length]);
		}
		return stringBuffer.toString();
	}
	
	
	//重命名并返回Map(上传文件的完整相对路径和url字符串)
	private static Map<String,String> reNameAndReturnFilePath(String fileType) throws Exception{
		
		// 上传文件的子文件夹,默认为当前日期的子文件夹
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		String savePath = "/" + sdf.format(new Date());

		// 重命名上传的文件
		String newFileName = new SimpleDateFormat("yyyyMMdd_HHmmss_SSS")
				.format(new Date())+"_"+getRandomString(5)+fileType;

		// 上传文件的完整相对路径

		String filePath = savePath + "/" + newFileName;
		
		String url = getFileSystemUploadServletPath() + "?savePath="
		+ savePath + "&newFileName=" + newFileName;
		
		Map<String,String> map=new HashMap<String,String>();
		map.put("filePath", filePath);
		map.put("url", url);
		
		return map;
	}
	
	
	//文件服务器通信协议
	private static HttpURLConnection getUrlConnection(String url) throws Exception{
		URL u = new URL(url);
		HttpURLConnection conn = (HttpURLConnection) u.openConnection();
		conn.setDoInput(true);
		conn.setDoOutput(true);
		conn.setRequestMethod("POST");
		conn.setConnectTimeout(10000);
		conn.setUseCaches(false);
		conn.setInstanceFollowRedirects(true);
		conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
		conn.setChunkedStreamingMode(64);
		conn.connect();
		
		return conn;
	}
	
	//关闭资源
	private static void close(InputStream is,OutputStream os,HttpURLConnection conn) throws Exception{
		if (null != is) {
			is.close();
		}
		if (null != os) {
			os.close();
		}
		if (null != conn) {
			conn.disconnect();
		}
	}
	
	// 调用文件服务器进行上传文件操作成功,则返回文件的相对路径
	private static String getResult(HttpURLConnection conn,String filePath) throws Exception{
		if (conn.getResponseCode() == HttpServletResponse.SC_OK) {
			return filePath;
		} else {
			return null;
		}
	}
	
	

	/**
	 * 文件上传 已封装文件重命名逻辑
	 * 
	 * @param upload 要上传的文件
	 * @param fileType 文件类型,如 .txt .jpg
	 * @return 上传成功则返回文件保存的相对路径,否则为null
	 * @throws Exception
	 */
	public static String uploadFile(File upload, String fileType)
			throws Exception {
		InputStream is = null;
		OutputStream os = null;
		HttpURLConnection conn = null;
		Map<String,String> map= null;
		try {
			map=reNameAndReturnFilePath(fileType);
			// *********与文件服务器通信,并传递数据********//
			conn=getUrlConnection(map.get("url"));
			os = conn.getOutputStream();
			is = new BufferedInputStream(new FileInputStream(upload));
			// 设置缓存
			byte[] buffer = new byte[8192];
			int length = 0;
			while ((length = is.read(buffer)) > 0) {
				os.write(buffer, 0, length);
			}
			os.flush();
			conn.getInputStream();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			// 关闭资源
			close(is, os, conn);
		}
		//返回结果
		return getResult(conn, map.get("filePath"));
	}
	
	
	/**
	 * 文件上传 已封装文件重命名逻辑
	 * 
	 * @param bytes 要上传的文件的二进制流

	 * 
	 * @param fileType 文件类型,如 .txt .jpg
	 * @return 上传成功则返回文件保存的相对路径,否则为null
	 * @throws Exception
	 */
	public static String uploadFile(byte[] bytes, String fileType)
			throws Exception {
		OutputStream os = null;
		HttpURLConnection conn = null;
		Map<String,String> map= null;
		try {
			map=reNameAndReturnFilePath(fileType);
			// *********与文件服务器通信,并传递数据********//
			conn=getUrlConnection(map.get("url"));
			os = conn.getOutputStream();
			os.write(bytes);
			os.flush();
			conn.getInputStream();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			// 关闭资源
			close(null, os, conn);
		}
		//返回结果
		return getResult(conn, map.get("filePath"));
	}

	
	
	/**
	 * 压缩图片上传 已封装文件重命名逻辑
	 * 
	 * @param bi 要上传的压缩图片
	 * @param fileType 文件类型,如 .txt .jpg
	 * @return 上传成功则返回文件保存的相对路径,否则为null
	 * @throws Exception
	 */
	public static String uploadFile(BufferedImage bi, String fileType)
	throws Exception {
		OutputStream os = null;
		HttpURLConnection conn = null;
		Map<String,String> map= null;
		try {
			map=reNameAndReturnFilePath(fileType);
			// *********与文件服务器通信,并传递数据********//
			conn=getUrlConnection(map.get("url"));
			os = conn.getOutputStream();
			ImageIO.write(bi, "jpg", os);
			os.flush();
			conn.getInputStream();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			// 关闭资源
			close(null, os, conn);
		}
		//返回结果
		return getResult(conn, map.get("filePath"));
	}

	
	/**
	 * 下载文件
	 * 
	 * @param filePath 文件存储的相对路径

	 * 
	 * @return
	 * @throws Exception
	 */
	public static InputStream downloadFile(String filePath) throws Exception {

		HttpURLConnection conn = null;

		String url = getFileSystemDownloadServletPath() + "?filePath="+ filePath;

		// *********与文件服务器通信********//
		conn=getUrlConnection(url);
		BufferedInputStream is = new BufferedInputStream(conn.getInputStream());

		// 调用文件服务器进行上传文件操作成功,则返回文件的流

		if (conn.getResponseCode() == HttpServletResponse.SC_OK) {
			return is;
		} else {
			return null;
		}
	} 

你可能感兴趣的:(服务器)