`

获取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
分享到:
评论

相关推荐

    多线程双图片源下载jsp

    "多线程双图片源下载jsp"这个实例展示了如何利用多线程技术从Google和Flickr这两个知名的图片服务平台上获取并下载图片,然后将这些图片保存到本地。下面我们将深入探讨相关的知识点。 1. **多线程**:多线程编程是...

    基于Python的关于Flickr图片网站的爬虫.pdf

    通过这种方式,研究者和开发者可以轻松地获取到高质量的图片资源,并将其应用于各种数据处理和分析任务中。 总结来说,基于Python的Flickr爬虫程序的开发和应用,不仅展示了Python语言在数据抓取方面的强大能力,也...

    flickr批量图片下载工具

    “下载”则说明了主要操作,即从flickr获取图片并保存到本地。 压缩包子文件的文件名“WebDownloaderWpf_build467_Setup”可能是指该工具的安装程序。"WebDownloaderWpf"很可能代表这是一个基于Windows ...

    基于Python的关于Flickr图片网站的爬虫.zip

    在开始编写爬虫之前,我们需要明确目标:确定要爬取的图片类型、大小、标签等信息,并理解Flickr的API(应用程序接口)。Flickr提供了一套RESTful API,允许开发者通过指定的URL和参数获取图片、用户、相册等各种...

    基于jquery的Flickr图片外链相册API可支持分类与全屏显示

    总的来说,基于jQuery的Flickr图片外链相册API项目需要理解并应用jQuery的基本操作,熟悉Flickr API的使用,以及具备良好的前端开发技巧,包括HTML、CSS和JavaScript。通过这样的实践,开发者不仅可以提升技术能力,...

    soap和rest的应用flickr(一个照片管理网站的源代码)

    本项目"soap和rest的应用flickr"是一个基于这两种技术实现的照片管理网站源代码,让我们深入探讨它们以及在实际应用中的工作原理。 首先,SOAP是一种基于XML的协议,主要用于在Web上交换结构化和类型化的信息。它的...

    php flickr源代码

    开发者需要获取API密钥以进行身份验证,并能使用这些密钥进行各种操作,如搜索图片、获取用户信息、上传照片等。 2. **OAuth认证**:由于安全考虑,Flickr使用OAuth协议进行身份验证。OAuth允许用户授权第三方应用...

    Flickr & WEBIMAGER-截图并上传到flickr的工具(转)

    3. **Flickr API**:上传图片至Flickr需要使用其提供的RESTful API,通过OAuth进行身份验证,获取上传权限,然后使用上传接口POST请求将图片数据发送到Flickr服务器。 4. **OAuth认证**:OAuth是一种授权协议,使得...

    Flickr-29566

    《Flickr API在.Net环境中的应用详解》 Flickr API 是一个强大的工具,它允许开发者通过编程方式访问Flickr网站的海量图片库和用户数据。本文将深入探讨如何在.Net环境中利用Flickr API进行开发,结合提供的...

    IOS应用源码之将视频分享到vimeo和flickr .rar

    本文将深入解析这个过程涉及的关键知识点,帮助你理解并应用到自己的项目中。 首先,我们要知道iOS中处理视频的基本框架是AVFoundation,它提供了丰富的多媒体处理能力,包括视频录制、编辑和播放。在这个源码中,...

    聚类分析Flickr照片地理数据的方法

    研究者进一步探索了这种结构与内容之间的相互作用,并利用分类方法来根据照片的视觉、文本和时间特征预测其地理位置。结果显示,相比于仅使用文本特征,加入视觉和时间特征能显著提高位置估计的准确性。 #### 应用...

    IOS应用源码——将视频分享到youtube,vimeo,facebook和flickr.zip

    该压缩包文件“IOS应用源码——将视频分享到youtube,vimeo,facebook和flickr.zip”包含了iOS应用开发的相关源代码,主要功能是让用户能够方便地将视频上传并分享到YouTube、Vimeo、Facebook以及Flickr这四大流行的...

    flickr的php接口

    8. **流式处理**:通过使用Flickr的“fql.multi”方法,可以一次性获取多个查询的结果,提高效率。 在使用过程中,注意处理可能出现的错误和异常,以及遵守Flickr的使用条款和API限制。通过这种方式,你可以利用...

    flickr-offloadr:Windows应用程序,用于批量下载公共Flickr照片

    通过flickr-offloadr,用户可以轻松地获取并保存感兴趣的图片,而无需手动一个接一个地下载。 首先,我们需要理解C#语言在软件开发中的角色。C#是一种面向对象的、现代的编程语言,由微软公司开发,广泛应用于...

    flickr-uploader, 上传一个媒体目录到 Flickr,作为你本地存储的备份.zip

    flickr-uploader, 上传一个媒体目录到 Flickr,作为你本地存储的备份 flickr上传器上传一个媒体目录到 Flickr,作为你本地存储的备份。有兴趣帮助管理请求请求和问题? 我需要一个或者多个协作者,因为我不再积极...

    Flickr 客户端(附源码)

    1. **Flickr API**:学习并理解Flickr的REST API,包括OAuth认证流程,获取访问令牌,以及如何调用不同的API端点来执行照片操作。 2. **C#编程**:熟练运用C#语法,包括类、对象、接口、事件处理等,以及.NET ...

    flickr:用于获取 flickr XML 图像源的 ASP .NET Web 应用程序

    “flickr:用于获取 flickr XML 图像源的 ASP .NET Web 应用程序”这个标题表明,这是一个基于ASP .NET技术构建的Web应用程序,其主要功能是获取并处理来自Flickr的照片数据。Flickr是著名的图片分享网站,提供了丰富...

    UICollectionView测试代码使用的Flickr类

    在这里,我们将会探讨如何使用Flickr API与UICollectionView结合,实现一个可以展示Flickr图片的iOS应用。 首先,为了与Flickr API交互,我们需要获取API密钥。Flickr API提供了多种数据获取方法,如RESTful API和...

Global site tag (gtag.js) - Google Analytics