| package com.matrix.component.ueditor.hunter; | 
| import com.matrix.component.ueditor.define.State; | 
| import com.matrix.component.ueditor.PathFormat; | 
| import com.matrix.component.ueditor.define.AppInfo; | 
| import com.matrix.component.ueditor.define.BaseState; | 
| import com.matrix.component.ueditor.define.MIMEType; | 
| import com.matrix.component.ueditor.define.MultiState; | 
| import com.matrix.component.ueditor.upload.StorageManager; | 
|   | 
| import java.net.HttpURLConnection; | 
| import java.net.InetAddress; | 
| import java.net.URL; | 
| import java.net.UnknownHostException; | 
| import java.util.Arrays; | 
| import java.util.List; | 
| import java.util.Map; | 
|   | 
|   | 
| /** | 
|  * 图片抓取器 | 
|  * @author hancong03@baidu.com | 
|  * | 
|  */ | 
| public class ImageHunter { | 
|   | 
|     private String filename = null; | 
|     private String savePath = null; | 
|     private String rootPath = null; | 
|     private List<String> allowTypes = null; | 
|     private long maxSize = -1; | 
|      | 
|     private List<String> filters = null; | 
|      | 
|     public ImageHunter ( Map<String, Object> conf ) { | 
|          | 
|         this.filename = (String)conf.get( "filename" ); | 
|         this.savePath = (String)conf.get( "savePath" ); | 
|         this.rootPath = (String)conf.get( "rootPath" ); | 
|         this.maxSize = (Long)conf.get( "maxSize" ); | 
|         this.allowTypes = Arrays.asList( (String[])conf.get( "allowFiles" ) ); | 
|         this.filters = Arrays.asList( (String[])conf.get( "filter" ) ); | 
|          | 
|     } | 
|      | 
|     public State capture ( String[] list ) { | 
|          | 
|         MultiState state = new MultiState( true ); | 
|          | 
|         for ( String source : list ) { | 
|             state.addState( captureRemoteData( source ) ); | 
|         } | 
|          | 
|         return state; | 
|          | 
|     } | 
|   | 
|     public State captureRemoteData ( String urlStr ) { | 
|          | 
|         HttpURLConnection connection = null; | 
|         URL url = null; | 
|         String suffix = null; | 
|          | 
|         try { | 
|             url = new URL( urlStr ); | 
|   | 
|             if ( !validHost( url.getHost() ) ) { | 
|                 return new BaseState( false, AppInfo.PREVENT_HOST ); | 
|             } | 
|              | 
|             connection = (HttpURLConnection) url.openConnection(); | 
|          | 
|             connection.setInstanceFollowRedirects( true ); | 
|             connection.setUseCaches( true ); | 
|          | 
|             if ( !validContentState( connection.getResponseCode() ) ) { | 
|                 return new BaseState( false, AppInfo.CONNECTION_ERROR ); | 
|             } | 
|              | 
|             suffix = MIMEType.getSuffix( connection.getContentType() ); | 
|              | 
|             if ( !validFileType( suffix ) ) { | 
|                 return new BaseState( false, AppInfo.NOT_ALLOW_FILE_TYPE ); | 
|             } | 
|              | 
|             if ( !validFileSize( connection.getContentLength() ) ) { | 
|                 return new BaseState( false, AppInfo.MAX_SIZE ); | 
|             } | 
|              | 
|             String savePath = this.getPath( this.savePath, this.filename, suffix ); | 
|             String physicalPath = this.rootPath + savePath; | 
|   | 
|             State state = StorageManager.saveFileByInputStream( connection.getInputStream(), physicalPath ); | 
|              | 
|             if ( state.isSuccess() ) { | 
|                 state.putInfo( "url", PathFormat.format( savePath ) ); | 
|                 state.putInfo( "source", urlStr ); | 
|             } | 
|              | 
|             return state; | 
|              | 
|         } catch ( Exception e ) { | 
|             return new BaseState( false, AppInfo.REMOTE_FAIL ); | 
|         } | 
|          | 
|     } | 
|      | 
|     private String getPath ( String savePath, String filename, String suffix  ) { | 
|          | 
|         return PathFormat.parse( savePath + suffix, filename ); | 
|          | 
|     } | 
|      | 
|     private boolean validHost ( String hostname ) { | 
|         try { | 
|             InetAddress ip = InetAddress.getByName(hostname); | 
|              | 
|             if (ip.isSiteLocalAddress()) { | 
|                 return false; | 
|             } | 
|         } catch (UnknownHostException e) { | 
|             return false; | 
|         } | 
|          | 
|         return !filters.contains( hostname ); | 
|          | 
|     } | 
|      | 
|     private boolean validContentState ( int code ) { | 
|          | 
|         return HttpURLConnection.HTTP_OK == code; | 
|          | 
|     } | 
|      | 
|     private boolean validFileType ( String type ) { | 
|          | 
|         return this.allowTypes.contains( type ); | 
|          | 
|     } | 
|      | 
|     private boolean validFileSize ( int size ) { | 
|         return size < this.maxSize; | 
|     } | 
|      | 
| } |