package com.baidu.ueditor.hunter; 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; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.context.ContextLoader; import com.baidu.ueditor.PathFormat; import com.baidu.ueditor.define.AppInfo; import com.baidu.ueditor.define.BaseState; import com.baidu.ueditor.define.MIMEType; import com.baidu.ueditor.define.MultiState; import com.baidu.ueditor.define.State; import com.baidu.ueditor.upload.StorageManager; import com.kingschan.blog.services.BlogResService; import com.kingschan.blog.util.BlogUrlHelper; /** * 图片抓取器 * @author hancong03@baidu.com * */ public class ImageHunter { private static Logger log =LoggerFactory.getLogger(ImageHunter.class); 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; private HttpServletRequest req; public ImageHunter ( Map<String, Object> conf ,HttpServletRequest p_req) { 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" ) ); this.req=p_req; log.info("【图片抓取器】filename:{},savePath:{},rootPath:{}",filename,savePath,rootPath); } 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 ) { log.info("捕获远程文件{}",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; log.info("savepath:{} ,physicalPath:{},type:{}",savePath,physicalPath,connection.getContentType().toString()); State state = StorageManager.saveFileByInputStream( connection.getInputStream(), physicalPath ); String key =null; BlogResService brs= ContextLoader.getCurrentWebApplicationContext().getBean(BlogResService.class); try { key=brs.uploadFile(physicalPath, BlogUrlHelper.getLastSlashData(urlStr), connection.getContentType().toString(), this.req); } catch (Exception e) { e.printStackTrace(); } if ( state.isSuccess()&&null!=key ) { state.putInfo( "url", String.format("http://res.51so.info/%s", key) );//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; } }