一、https://developers.google.com/image-search/v1/jsondevguide
参考以上网址,了解Google iamge search的基本格式。
二、http://www.flickr.com/services/api/response.json.html
参考以上网址,了解Flickr的基本格式。
三、
以上是页面的运行效果。
前台页面:index.jsp主要代码
<script type="text/javascript" src="scripts/jquery-1.4.4.js"></script>
<script type="text/javascript">
$(function()
{
$("#button1").click(function()
{
$.get("GetImageServlet",
{
categoryName: $("#categoryName").val(),
picSource: $("input[name=picSource]:checked").val()//得到input标签name属性为picSource并且被选中的值
}, function(returnedData, status)
{
$("#div1").empty();
var html = "";
for(var i = 0; i < returnedData.length; i++)
{
html += "<img src='" + returnedData[i] + "' width='150' height='150'>";
}
$("#div1").append(html);
});
});
$("#button2").click(function()
{
$("#div2").html("<font color='red'>process...</font>");
$.post("SaveImageServlet",{},function(){
});
});
});
</script>
<body>
<input type="text" id="categoryName">
<input type="radio" name="picSource" value="google" checked>Google
<input type="radio" name="picSource" value="flickr">Flickr
<input type="button" value="click" id="button1">
<input type="button" value="save" id="button2">
<div id="div2"></div>
<div id="div1"></div>
</body>
图片获取程序用一个servlet处理。
GetImageServlet代码如下:
public class GetImageServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
try
{
String categoryName = req.getParameter("categoryName");
String picSource = req.getParameter("picSource");
List<String> returnedList = new ArrayList<String>();
HttpSession session = req.getSession();
session.setAttribute("categoryName", categoryName);
session.setAttribute("picSource", picSource);
session.setAttribute("images", returnedList);
if ("google".equals(picSource))
{
List<String> list = new ArrayList<String>();
for (int i = 0; i < 8; i++)
{
String queryString = new StringBuffer(Constant.GOOGLE_URL)
.append("q=").append(categoryName)
.append("&start=").append(8 * i).toString();
list.add(NetworkUtil.getStringContentFromURL(queryString));
}
for (String result : list)
{
JSONObject jsonContent = new JSONObject(result);
JSONObject responseData = jsonContent
.getJSONObject("responseData");
JSONArray results = responseData.getJSONArray("results");
for (int i = 0; i < results.length(); i++)
{
JSONObject jsonObject = results.getJSONObject(i);
String url = jsonObject.getString("url");
returnedList.add(url);
}
}
}
//flickr
else
{
String urlString = Constant.FLICKR_URL + "tags=" +categoryName;
String jsonContent = NetworkUtil.getStringContentFromURL(urlString);
jsonContent = jsonContent.substring(14,jsonContent.length()-1);
JSONObject jsonObject = new JSONObject(jsonContent);
JSONArray jsonArray = jsonObject.getJSONObject("photos").getJSONArray("photo");
for(int i = 0; i < jsonArray.length(); i ++)
{
JSONObject object = jsonArray.getJSONObject(i);
String id = object.getString("id");
int farmId = object.getInt("farm");
String serverId = object.getString("server");
String secretId = object.getString("secret");
StringBuffer buffer = new StringBuffer();
buffer.append("http://farm").append(farmId).append(
".static.flickr.com/").append(serverId).append("/")
.append(id).append("_").append(secretId).append(
".jpg");
returnedList.add(buffer.toString());
}
}
Gson gson = new Gson();
String jsonResult = gson.toJson(returnedList);
resp.setContentType("application/json; charset=utf-8");
resp.setHeader("pragma", "no-cache");
resp.setHeader("cache-control", "no-cache");
PrintWriter out = resp.getWriter();
out.print(jsonResult);
out.flush();
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
图片保存SaveImageServlet代码如下:
public class SaveImageServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
try {
HttpSession session = req.getSession();
String categoryName = (String) session.getAttribute("categoryName");
String picSource = (String) session.getAttribute("picSource");
List<String> list = (List<String>)session.getAttribute("images");
String path = req.getSession().getServletContext().getRealPath("/storeImage");
File directory = new File(path,picSource + "/" + categoryName);
directory.mkdirs();
String[] array = null;
for(int i = 0;i < list.size();i ++)
{
array = new String[1];
String imageUrl = list.get(i);
int position = imageUrl.lastIndexOf("/");
String imageName = imageUrl.substring(position+1);
File file = new File(directory,imageName);
array[0] = imageUrl;
new SaveImageThread(directory, array).start();
//NetworkUtil.write2LocalFormInternet(imageUrl, file);
}
resp.getWriter().print("success");
resp.getWriter().flush();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
}
用到的多线程SaveImageThread代码如下:
public class SaveImageThread extends Thread{
private File directory;
private String[] imageUrls;
public SaveImageThread(File directory,String[] imageUrls)
{
this.directory = directory;
this.imageUrls = imageUrls;
}
@Override
public void run() {
long startTime = System.currentTimeMillis();
try {
for(String imageUrl : imageUrls)
{
int options = imageUrl.lastIndexOf("/");
String imageName = imageUrl.substring(options + 1);
File file = new File(directory, imageName);
NetworkUtil.write2LocalFormInternet(imageUrl, file);
}
} catch (Exception e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println(this.getName()+ ": " + (endTime - startTime));
}
}
用到的其他自定义的工具类Constant、NetworkUtil:
constant代码如下(图片源链接地址,都用到了key值):
public class Constant
{
public static final String
GOOGLE_URL= "http://ajax.googleapis.com/ajax/services/search/images?key=ABQIAAAAHMkDJuY1vzGaqUjliVAN-RSo6_Y-lPd_7a5rWdJRsISKKsAXgBQyI4z9PBvV4NjKXO02MH68cek4yA&rsz=large&v=1.0&";
public static final String
FLICKR_URL= "http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=f3b43f6fa55b9b17935d65c7170b9a60&extras=original_format&per_page=100&format=json&";
}
NetworkUtil的代码如下:
public class NetworkUtil
{
public static String getStringContentFromURL(String queryString) throws Exception
{
URL url = new URL(queryString);
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
StringBuffer buffer = new StringBuffer();
String line = null;
while(null != (line = br.readLine()))
{
buffer.append(line);
}
br.close();
isr.close();
is.close();
return buffer.toString();
}
public static void write2LocalFormInternet(String imageUrl,File file)throws Exception
{
InputStream is = null;
OutputStream os = null;
try
{
URL url = new URL(imageUrl);
is = url.openStream();
os = new FileOutputStream(file);
int length = -1;
byte[] buffer = new byte[7092];
while(-1 != (length = is.read(buffer,0,7092)))
{
os.write(buffer,0,length);
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if(is != null)
is.close();
if(os != null)
os.close();
}
}
以上完,详情参考其他资料。谢谢!