| package com.matrix.component.ueditor.upload; | 
| import com.matrix.component.ueditor.define.State; | 
| import java.io.BufferedInputStream; | 
| import java.io.BufferedOutputStream; | 
| import java.io.File; | 
| import java.io.FileOutputStream; | 
| import java.io.IOException; | 
| import java.io.InputStream; | 
|   | 
| import com.matrix.component.ueditor.define.AppInfo; | 
| import com.matrix.component.ueditor.define.BaseState; | 
| import org.apache.commons.io.FileUtils; | 
|   | 
| public class StorageManager { | 
|     public static final int BUFFER_SIZE = 8192; | 
|   | 
|     public StorageManager() { | 
|     } | 
|   | 
|     public static State saveBinaryFile(byte[] data, String path) { | 
|         File file = new File(path); | 
|   | 
|         State state = valid(file); | 
|   | 
|         if (!state.isSuccess()) { | 
|             return state; | 
|         } | 
|   | 
|         try { | 
|             BufferedOutputStream bos = new BufferedOutputStream( | 
|                     new FileOutputStream(file)); | 
|             bos.write(data); | 
|             bos.flush(); | 
|             bos.close(); | 
|         } catch (IOException ioe) { | 
|             return new BaseState(false, AppInfo.IO_ERROR); | 
|         } | 
|   | 
|         state = new BaseState(true, file.getAbsolutePath()); | 
|         state.putInfo( "size", data.length ); | 
|         state.putInfo( "title", file.getName() ); | 
|         return state; | 
|     } | 
|   | 
|     public static State saveFileByInputStream(InputStream is, String path, | 
|             long maxSize) { | 
|         State state = null; | 
|   | 
|         File tmpFile = getTmpFile(); | 
|   | 
|         byte[] dataBuf = new byte[ 2048 ]; | 
|         BufferedInputStream bis = new BufferedInputStream(is, StorageManager.BUFFER_SIZE); | 
|   | 
|         try { | 
|             BufferedOutputStream bos = new BufferedOutputStream( | 
|                     new FileOutputStream(tmpFile), StorageManager.BUFFER_SIZE); | 
|   | 
|             int count = 0; | 
|             while ((count = bis.read(dataBuf)) != -1) { | 
|                 bos.write(dataBuf, 0, count); | 
|             } | 
|             bos.flush(); | 
|             bos.close(); | 
|   | 
|             if (tmpFile.length() > maxSize) { | 
|                 tmpFile.delete(); | 
|                 return new BaseState(false, AppInfo.MAX_SIZE); | 
|             } | 
|   | 
|             state = saveTmpFile(tmpFile, path); | 
|   | 
|             if (!state.isSuccess()) { | 
|                 tmpFile.delete(); | 
|             } | 
|   | 
|             return state; | 
|              | 
|         } catch (IOException e) { | 
|         } | 
|         return new BaseState(false, AppInfo.IO_ERROR); | 
|     } | 
|   | 
|     public static State saveFileByInputStream(InputStream is, String path) { | 
|         State state = null; | 
|   | 
|         File tmpFile = getTmpFile(); | 
|   | 
|         byte[] dataBuf = new byte[ 2048 ]; | 
|         BufferedInputStream bis = new BufferedInputStream(is, StorageManager.BUFFER_SIZE); | 
|   | 
|         try { | 
|             BufferedOutputStream bos = new BufferedOutputStream( | 
|                     new FileOutputStream(tmpFile), StorageManager.BUFFER_SIZE); | 
|   | 
|             int count = 0; | 
|             while ((count = bis.read(dataBuf)) != -1) { | 
|                 bos.write(dataBuf, 0, count); | 
|             } | 
|             bos.flush(); | 
|             bos.close(); | 
|   | 
|             state = saveTmpFile(tmpFile, path); | 
|   | 
|             if (!state.isSuccess()) { | 
|                 tmpFile.delete(); | 
|             } | 
|   | 
|             return state; | 
|         } catch (IOException e) { | 
|         } | 
|         return new BaseState(false, AppInfo.IO_ERROR); | 
|     } | 
|   | 
|     private static File getTmpFile() { | 
|         File tmpDir = FileUtils.getTempDirectory(); | 
|         String tmpFileName = (Math.random() * 10000 + "").replace(".", ""); | 
|         return new File(tmpDir, tmpFileName); | 
|     } | 
|   | 
|     private static State saveTmpFile(File tmpFile, String path) { | 
|         State state = null; | 
|         File targetFile = new File(path); | 
|   | 
|         if (targetFile.canWrite()) { | 
|             return new BaseState(false, AppInfo.PERMISSION_DENIED); | 
|         } | 
|         try { | 
|             FileUtils.moveFile(tmpFile, targetFile); | 
|         } catch (IOException e) { | 
|             return new BaseState(false, AppInfo.IO_ERROR); | 
|         } | 
|   | 
|         state = new BaseState(true); | 
|         state.putInfo( "size", targetFile.length() ); | 
|         state.putInfo( "title", targetFile.getName() ); | 
|          | 
|         return state; | 
|     } | 
|   | 
|     private static State valid(File file) { | 
|         File parentPath = file.getParentFile(); | 
|   | 
|         if ((!parentPath.exists()) && (!parentPath.mkdirs())) { | 
|             return new BaseState(false, AppInfo.FAILED_CREATE_FILE); | 
|         } | 
|   | 
|         if (!parentPath.canWrite()) { | 
|             return new BaseState(false, AppInfo.PERMISSION_DENIED); | 
|         } | 
|   | 
|         return new BaseState(true); | 
|     } | 
| } |