`

获取Google、Flickr图片源,并应用多线程方法将其保存到本地

阅读更多

 

一、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();

}

}

 

以上完,详情参考其他资料。谢谢!

 

 

 

 

 

 

  • 大小: 1.3 MB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics