双数据源多线程图片下载(google、flickr)

来源:互联网 发布:ubuntu 优麒麟区别 编辑:程序博客网 时间:2024/05/23 00:10

 

一.前台布局

index.jsp………………………………………………………………………………………………页面的布局:

<body>
<input type="text" name="searchCondition" ><inputtype="radio" name="getInfoMethod" value="google"checked="checked">google<input type="radio"name="getInfoMethod" value="flicker">flicker<inputtype="button" id="getInfoFromServer"value="getInformation">&nbsp;<input type="button"id="saveButton" value="save">
<div id="picDiv"></div>
</body>事件的处理:<script type="text/javascript">
$(document).ready(function()
{
$("#getInfoFromServer").click(function()
{
$.post("MyGoogleImageService", //调用jquery的post方法,传送异步请求(提交url,传送数据,回调函数)
{
getInfoMethod:$("input[name=getInfoMethod]:checked").val(),
searchCondition:$("input:eq(0)").val()
},function(returnedData,status){
//alert(returnedData);
$("#picDiv").empty();
var html = "";
for(var i=0 ;i<returnedData.length;i++)
{
html += "<image src='"+returnedData[i]+"' width='150'height='150' border='1'> "
}
$("#picDiv").append(html);



});
});

//                     saveButton
$("#saveButton").click(function(){
$.post("MyGoogleImageSaveService", //图片的保存
{

},
function(returnedData,status)
{
alert(returnedData);
});
});
});二.创建处理图片工具类和处理类1.定制google、flickr服务的url,设计成常量
public static String GOOGLE_SERVICE_URL = "https://ajax.googleapis.com/ajax/services/search/images?v=1.0&key=AIzaSyBXr9XaOzXJgUqwbU9JFRhnBFpABaM769s&imgSize=xxlarge&";/v 版本号、key 自己申请的api_key、imgSize返回图片的大小 (后面还有个q查询的关键字)


public static String FLICKR_SERVICE_URL ="http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=5a6fde7601f7aa53e647b5a4f377268a&extras=original_format&format=json&per_page=100&";//method 采用的服务\api_key自己申请、extras返回的额外信息、返回数据的个数json(类似json)、per_page返回每页的照片数(tags查找关键字)2.公用网络工具类//图片url的获取//get+返回值类型+返回的形式(文本、数据、数组)+From+参数
public static String getStringContentFromURL(String queryString) //queryString 为url加上查找条件的url请求
{
//创建返回的数据引用
StringBuffer stringBuffer = new StringBuffer();
try
{
URL url = new URL(queryString);

URLConnection connection = url.openConnection();

InputStream iStream =connection.getInputStream();
InputStreamReader iStreamReader = new InputStreamReader(iStream);//字符流
BufferedReader bufferedReader = new BufferedReader(iStreamReader); //缓冲



String line = null;
if(null != (line = bufferedReader.readLine()))
{
stringBuffer.append(line); //写入StringBuffer

}

bufferedReader.close();
iStreamReader.close();
iStream.close();
}
catch (MalformedURLException e)
{
//创建url
e.printStackTrace();
}
catch (IOException e)
{
//URLConnection创建
e.printStackTrace();
}
return stringBuffer.toString();
}//图片保存的公共工具//保存

public static void save2LocalImageFromInternet(String imageUrl,File file)
{
InputStream iStream = null;
OutputStream oStream = null;
try
{

URL url = new URL(imageUrl);


iStream = url.openStream();
//创建写到本地的文件
oStream = new FileOutputStream(file);

int length = -1;
byte[] bt = new byte[10000];
while (-1 != (length = iStream.read(bt,0,10000)))
{
oStream.write(bt,0,length);
}



}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if(oStream != null)
{
try
{
oStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
if(iStream != null)
{
try
{
iStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}

}

}
3.图片搜索的处理Servletpublic class MyGoogleImageService extendsHttpServlet
{
private void process(HttpServletRequest request,
HttpServletResponse response) throws IOException
{
//得到前台传过来的参数
String getMethodString= request.getParameter("getInfoMethod");
String searchCondition = request.getParameter("searchCondition");


//返回的参数设置
response.setContentType("application/json,charset=utf-8");
response.setHeader("pragma","no-cache");
response.setHeader("cache-control","no-cache");
PrintWriter out = response.getWriter();

//存储返回客户端的数据
List<String> returnedData = new ArrayList<String>();


//共享数据,创建session,避免图片来回传递(主要是考虑到了图片查找后的保存操作,不用点击save时,客户端再把url传递给服务器)

HttpSession session = request.getSession();
session.setAttribute("getMethodString",getMethodString);
session.setAttribute("searchCondition",searchCondition);
session.setAttribute("myreturneddatapicturesurl",returnedData);
// session中只是保存了一个引用,后面对数据的修改,也会保存起来

if("google".equals(getMethodString))
{
//存储返回的8次查找的json数据
List<String> googleOneList = new ArrayList<String>();


for(int i=0 ;i<8;i++)
{
//利用StringBuffer创建一个String
String GoogleUrlQuery = new StringBuffer(Constant.GOOGLE_SERVICE_URL)
.append("start=").append(i*8) //google请求一次请求只能返回8个,总共可以请求8次
.append("&").append("q=").append(searchCondition).toString();
// System.out.println("GoogleUrlQuery="+GoogleUrlQuery);
googleOneList.add(NetWorkUtil.getStringContentFromURL(GoogleUrlQuery)); //调用工具类,提供服务

System.out.println("地址传过来的个数="+NetWorkUtil.getStringContentFromURL(GoogleUrlQuery).length());
}

for(String responseData : googleOneList) ///对返回来的数据进行解析
{
System.out.println("responseData:"+responseData);
try
{
JSONObject jsObject_responseData = new JSONObject(responseData);
JSONObject jsObject_results =jsObject_responseData.getJSONObject("responseData");
JSONArray jsArray_results = jsObject_results.getJSONArray("results");//返回的数组对象
for(int j=0 ;j <jsArray_results.length(); j++)
{
JSONObject jsonObject_getURL = jsArray_results.getJSONObject(j);

String urlString_Google = jsonObject_getURL.getString("url");
System.out.println("urlString_Google:"+urlString_Google);
returnedData.add(urlString_Google);

}
}
catch (JSONException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

}


//System.out.println(googleOneList);

//遍历返回的json对象,取出有用数据,以json返回
}
else {
String FlickrUrlQuery = new StringBuffer(Constant.FLICKR_SERVICE_URL)
.append("tags=").append(searchCondition).toString();
String flickrServiceString =NetWorkUtil.getStringContentFromURL(FlickrUrlQuery);
//获得返回来的服务数据
//System.out.println("flickrServiceString:"+flickrServiceString);//一个返回来的数据格式,比较特殊
/*
* flickrServiceString:jsonFlickrApi({"photos":{"page":1,"pages":201, "perpage":100,"total":"20014","photo":[{"id":"7844416268","owner":"54351420@N00","secret":"2f40056d55", "server":"8289","farm":9, "title":"Juliana Arevalo","ispublic":1, "isfriend":0, "isfamily":0},{"id":"7811879494","owner":"27376614@N07","secret":"68214871a8", "server":"7270","farm":8, "title":"DSC_0145", "ispublic":1,"isfriend":0, "isfamily":0}]},"stat":"ok"})
*/
//获取字符串形式的json数据
String jsonString = flickrServiceString.substring(14,flickrServiceString.length()-1);
try
{
JSONObject photosObject = new JSONObject(jsonString);
JSONObject photosValueObject = photosObject.getJSONObject("photos");
//获得photo所在的数组
JSONArray photoArray = photosValueObject.getJSONArray("photo");
for(int i=0 ;i<photoArray.length(); i++)
{
// http://farm{farm-id}.staticflickr.com/{server-id}/{id}_{secret}.jpg

JSONObject photoObject = photoArray.optJSONObject(i);
//getJSONObject(i);也可以
//实例,一个数据{"id":"7844416268","owner":"54351420@N00","secret":"2f40056d55", "server":"8289","farm":9, "title":"Juliana Arevalo","ispublic":1, "isfriend":0, "isfamily":0}
int farmid= photoObject.getInt("farm");
String serverid= photoObject.getString("server");
String id = photoObject.getString("id");
String secret = photoObject.getString("secret");//返回图片的url数据String photourl ="http://farm"+farmid+".staticflickr.com/"+serverid+"/"+id+"_"+secret+".jpg";
System.out.println("photourl:"+photourl);
returnedData.add(photourl);


}

}
catch (JSONException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}



}

//处理要返回的数据
Gson gson = new Gson();

String returnedDataString = gson.toJson(returnedData);
out.print(returnedDataString);
out.flush();
}}
4.图片的保存public class MyGoogleImageSaveService extends HttpServlet
{
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
//从session获取图片 查找条件 查找源 url结果集
HttpSession session = request.getSession();

String getMethodString =(String)session.getAttribute("getMethodString");
String searchCondition =(String)session.getAttribute("searchCondition");
List<String> imageUrl =(List<String>)session.getAttribute("myreturneddatapicturesurl");

//创建在服务器的保存目录
String pathString =request.getSession().getServletContext().getRealPath("");
//发布情况一:上述表示获取到webapps/ImageService,所创建的东东均在此目录下
//配置情况:上述需加 getRealPath("/ImageService");

File directory = new java.io.File(pathString,getMethodString+File.separator+searchCondition);
directory.mkdirs(); //创建google\apple


//定义多线程的存储数组

String[] array = null;
//获取图片名
for(int i=0 ;i< imageUrl.size() ;i++)
{

//创建一个保存文件的File对象
File file = new File(directory,imageName);



//多线程调用 一个线程处理一个数组中的调用

if( i % 4 == 0)
{
if(i != 0)//排除刚开始的情况,数组中无内容
{
new MultipleThreadSave(array,directory).start();
}
array = new String[4];

}
array[i%4] = imageUrl.get(i);

}


response.getOutputStream().print("success");
response.getOutputStream().flush();

}}5.线程public class MultipleThreadSave extends Thread
{
String[] imageUrlArray;
File directory; //需要对数组对象进行分析和保存

public MultipleThreadSave(String[] imageUrlArray,File directory)
{
this.imageUrlArray = imageUrlArray;
this.directory = directory;
}@Override
public void run()
{
long startTimeThread = System.currentTimeMillis();
for(int i=0 ;i <imageUrlArray.length ;i++)
{


String oneImageUrl = imageUrlArray[i].toString(); //数组对象获得url

int position = oneImageUrl.lastIndexOf("/");
//注意文件的分割线是\是有滑线 &#92;
//注意用分割线获取到的是 imageName=http://farm9.staticflickr.com/8431/7854358472_7f56aff77b.jpg
String imageName = oneImageUrl.substring(position+1);


File file = new File(directory,imageName);
NetWorkUtil.save2LocalImageFromInternet(oneImageUrl,file);
}

long endTimeThread = System.currentTimeMillis();

System.out.println(Thread.currentThread().getName()+"timeelapsed:"+(endTimeThread-startTimeThread)); //由于多线程结束时间不一致,要比较只能看用时最长的那个

}}
(上述代码仅是主要代码,非完整版)

原创粉丝点击