LIstView に表示された画像を インターネットからダウンロードしてファイルに保存する
到達点
- ListView に表示される画像をインターネットからダウンロードして、指定したサーバ上のフォルダにファイルとして保存する。
- サーバ上の画像保存フォルダは固定する。
- インターネット上の画像は複数サイズあるので、ダウンロードする画像サイズを選択できるようにする。デフォルトは全サイズ選択状態とする。
- 選択画像サイズは、一括チェック、一括チェック解除できること。
- ページ表示時に、自動で画像をダウンロードするかしないか選べるようにする。デフォルトは自動でダウンロードしないとする。
- ListView の各アイテムには、ダウンロード対象画像へのハイパーリンクをサイズ別に表示する。オリジナルサイズは画像にハイパーリンクを埋め込む。
仕様
- 画像のインターネット上のベースURL、サーバのダウンロード先フォルダは web.config で設定する。
- 選択画像サイズはチェックボックスリストコントロールを使用する。選択値はコントロールに直接埋め込む。
- 選択画像サイズを一括チェック、一括チェック解除には、チェックボックスを使用する。
- ダウンロードボタンで画像をダウンロードする場合は、非同期通信とする。非同期通信中は「ダウンロード中...」を表示し、ダウンロード完了後は「ダウンロード完了」を表示する。なお、「ダウンロード完了」はページロード時に初期化するので、いずれかの画像サイズをチェックした状態で再度ダウンロードを押した場合、今回のダウンロード中も、前回の「ダウンロード完了」が表示されたままになる。
- 非同期通信には AJAX Extensions の UpdatePanel を使用する。
- 画像ダウンロードは System.Net の名前空間の WebClient() を使用する。
- ページ表示時の画像自動ダウンロードはチェックボックスで判定する。自動ダウンロードにチェックがある場合は、ListView のDataBound イベントで、選択されているダウンロード対象の画像サイズに従い、画像をダウンロードする。
完成イメージ
ダウンロードボタンをクリックすると、インターネットから選択したサイズの画像を非同期でダウンロードする。ここでは横幅が150ピクセルの画像をダウンロードするように選択した。
ダウンロード中は UpdateProgress を使用して、ダウンロード中 のメッセージを表示し、ダウンロードが完了するとメッセージは消え、ダウンロード完了 が表示される。
画像はweb.config のappSettings で指定したフォルダに、画像サイズごとに分別されて保存される。横幅150ピクセル以外のフォルダは空。
「ページ表示時に画像をダウンロードする」にチェックを入れると、ページを表示するとき(イベントは ListView の ItemDataBound)に選択されている画像サイズの画像をすべてダウンロードする。ここでは、すべての
画像サイズにチェックを入れ、次ページをクリックした。
すると同期通信で画像のダウンロードが開始される。同期通信なので操作は受け付けない。ダウンロードが完了するまで待つ。
次ページが表示された。
すべての画像サイズの画像がダウンロードされている。
ソース
web.config
<?xml version="1.0"?>
<!--
ASP.NET
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<connectionStrings>
<add name="TESTConnectionString" connectionString="Data Source=SN78SH7;Initial Catalog=TEST;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.5">
<assemblies>
<add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>
</compilation>
<httpRuntime targetFramework="4.5"/>
</system.web>
<appSettings>
<add key="ImageURL" value="http://d3gtl9l2a4fn1j.cloudfront.net/t/p/"/>
<add key="ImageTMDbPosterFolder" value="D:\TMDbPoster"/>
</appSettings>
</configuration>
<!--
ASP.NET
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<connectionStrings>
<add name="TESTConnectionString" connectionString="Data Source=SN78SH7;Initial Catalog=TEST;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.5">
<assemblies>
<add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>
</compilation>
<httpRuntime targetFramework="4.5"/>
</system.web>
<appSettings>
<add key="ImageURL" value="http://d3gtl9l2a4fn1j.cloudfront.net/t/p/"/>
<add key="ImageTMDbPosterFolder" value="D:\TMDbPoster"/>
</appSettings>
</configuration>
ListViewPosterDL.asx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="ListViewPosterDL.aspx.vb" Inherits="ListViewPosterDL" %>
<%@ Register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="asp" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
</asp:ToolkitScriptManager>
W:<asp:TextBox ID="TextBoxW" runat="server" Columns="4">150</asp:TextBox>
H:<asp:TextBox ID="TextBoxH" runat="server" Columns="4">300</asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="" />
<asp:CheckBox ID="CheckBoxDLatLoad" runat="server" Text="" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:CheckBox ID="CheckBoxSize" runat="server" AutoPostBack="True" Text="" Checked="True" />
<asp:CheckBoxList ID="CheckBoxListSize" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow">
<asp:ListItem Value="/original" Selected="True"></asp:ListItem>
<asp:ListItem Value="/w150" Selected="True">150</asp:ListItem>
<asp:ListItem Value="/w300" Selected="True">300</asp:ListItem>
<asp:ListItem Value="/w600" Selected="True">600</asp:ListItem>
<asp:ListItem Value="/w1280" Selected="True">1280</asp:ListItem>
</asp:CheckBoxList>
<asp:Button ID="ButtonDownload" runat="server" Text="" />
<asp:Label ID="LabelDownloadStatus" runat="server" ForeColor="#FF3300"></asp:Label>
<asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1" DynamicLayout="False">
<ProgressTemplate>
<asp:Label ID="Label1" runat="server" ForeColor="#FF3300" Text="..."></asp:Label>
</ProgressTemplate>
</asp:UpdateProgress>
</ContentTemplate>
</asp:UpdatePanel>
<asp:ListView ID="ListView1" runat="server" DataKeyNames="ID" DataSourceID="SqlDataSource1" GroupItemCount="12">
<AlternatingItemTemplate>
<td runat="server" style="vertical-align: top">ID:
<asp:Label ID="IDLabel" runat="server" Text='<%# Eval("ID") %>' />
<br />STREAMID:
<asp:Label ID="STREAMIDLabel" runat="server" Text='<%# Eval("STREAMID") %>' Visible="False" />
<br />TMDbID:
<asp:Label ID="TMDbIDLabel" runat="server" Text='<%# Eval("TMDbID") %>' />
<br />aspect_ratio:
<asp:Label ID="aspect_ratioLabel" runat="server" Text='<%# Eval("aspect_ratio") %>' />
<br />file_path:
<asp:Label ID="file_pathLabel" runat="server" Text='<%# Eval("file_path") %>' Visible="False" />
<br />height:
<asp:Label ID="heightLabel" runat="server" Text='<%# Eval("height") %>' />
<br />width:
<asp:Label ID="widthLabel" runat="server" Text='<%# Eval("width") %>' />
<br />
[<asp:HyperLink ID="HyperLinkw150" runat="server" Target="_blank">150</asp:HyperLink>
][<asp:HyperLink ID="HyperLinkw300" runat="server" Target="_blank">300</asp:HyperLink>
][<asp:HyperLink ID="HyperLinkw600" runat="server" Target="_blank">600</asp:HyperLink>
][<asp:HyperLink ID="HyperLinkw1280" runat="server" Target="_blank">1280</asp:HyperLink>
]<br />
<asp:HyperLink ID="HyperLinkoriginal" runat="server" ImageUrl='<%# "imagePoster.aspx?ID=" + Convert.ToString(DataBinder.Eval(Container.DataItem, "ID")) + "&w=" + Convert.ToString(DataBinder.Eval(Container.DataItem, "w")) + "&h=" + Convert.ToString(DataBinder.Eval(Container.DataItem, "h")) %>' Target="_blank">ORG</asp:HyperLink>
</td>
</AlternatingItemTemplate>
<EmptyDataTemplate>
<table runat="server" style="">
<tr>
<td></td>
</tr>
</table>
</EmptyDataTemplate>
<EmptyItemTemplate>
<td runat="server" />
</EmptyItemTemplate>
<GroupTemplate>
<tr id="itemPlaceholderContainer" runat="server">
<td id="itemPlaceholder" runat="server"></td>
</tr>
</GroupTemplate>
<ItemTemplate>
<td runat="server" style="vertical-align: top">ID:
<asp:Label ID="IDLabel" runat="server" Text='<%# Eval("ID") %>' />
<br />STREAMID:
<asp:Label ID="STREAMIDLabel" runat="server" Text='<%# Eval("STREAMID") %>' Visible="False" />
<br />TMDbID:
<asp:Label ID="TMDbIDLabel" runat="server" Text='<%# Eval("TMDbID") %>' />
<br />aspect_ratio:
<asp:Label ID="aspect_ratioLabel" runat="server" Text='<%# Eval("aspect_ratio") %>' />
<br />file_path:
<asp:Label ID="file_pathLabel" runat="server" Text='<%# Eval("file_path") %>' Visible="False" />
<br />height:
<asp:Label ID="heightLabel" runat="server" Text='<%# Eval("height") %>' />
<br />width:
<asp:Label ID="widthLabel" runat="server" Text='<%# Eval("width") %>' />
<br />
[<asp:HyperLink ID="HyperLinkw150" runat="server" Target="_blank">150</asp:HyperLink>
][<asp:HyperLink ID="HyperLinkw300" runat="server" Target="_blank">300</asp:HyperLink>
][<asp:HyperLink ID="HyperLinkw600" runat="server" Target="_blank">600</asp:HyperLink>
][<asp:HyperLink ID="HyperLinkw1280" runat="server" Target="_blank">1280</asp:HyperLink>
]<br />
<asp:HyperLink ID="HyperLinkoriginal" runat="server" ImageUrl='<%# "imagePoster.aspx?ID=" + Convert.ToString(DataBinder.Eval(Container.DataItem, "ID")) + "&w=" + Convert.ToString(DataBinder.Eval(Container.DataItem, "w")) + "&h=" + Convert.ToString(DataBinder.Eval(Container.DataItem, "h")) %>' Target="_blank">ORG</asp:HyperLink>
</td>
</ItemTemplate>
<LayoutTemplate>
<table runat="server">
<tr id="Tr1" runat="server">
<td id="Td1" runat="server" style="">
<asp:DataPager ID="DataPager2" runat="server" PageSize="24">
<Fields>
<asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="True" ShowLastPageButton="True" />
<asp:NumericPagerField ButtonCount="50" />
</Fields>
</asp:DataPager>
</td>
</tr>
<tr runat="server">
<td runat="server">
<table id="groupPlaceholderContainer" runat="server" border="0" style="">
<tr id="groupPlaceholder" runat="server">
</tr>
</table>
</td>
</tr>
<tr runat="server">
<td runat="server" style="">
<asp:DataPager ID="DataPager1" runat="server" PageSize="24">
<Fields>
<asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="True" ShowLastPageButton="True" />
<asp:NumericPagerField ButtonCount="50" />
</Fields>
</asp:DataPager>
</td>
</tr>
</table>
</LayoutTemplate>
</asp:ListView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:TESTConnectionString %>" SelectCommand="SELECT [ID], [STREAMID], [TMDbID], [aspect_ratio], [file_path], [height], [width], [iso_639_1], [vote_average], [vote_count],@w as w,@h as h FROM [TMDbPoster]">
<SelectParameters>
<asp:ControlParameter ControlID="TextBoxW" Name="w" PropertyName="Text" />
<asp:ControlParameter ControlID="TextBoxH" Name="h" PropertyName="Text" />
</SelectParameters>
</asp:SqlDataSource>
</div>
</form>
</body>
</html>
ListViewPosterDL.aspx.vb
Imports System.Net
Partial Class ListViewPosterDL
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
LabelDownloadStatus.Text = ""
End Sub
Protected Sub ListView1_ItemDataBound(sender As Object, e As ListViewItemEventArgs) Handles ListView1.ItemDataBound
Dim ImageURL As String = ConfigurationManager.AppSettings("ImageURL")
Dim ImageTMDbPosterFolder As String = ConfigurationManager.AppSettings("ImageTMDbPosterFolder")
Dim objfile_pathLabel As New Object
Dim objHyperLink As New Object
Dim strHyperLinkNmae As String
Dim URL As String
Dim wc As New System.Net.WebClient()
objfile_pathLabel = e.Item.FindControl("file_pathLabel")
If Not objfile_pathLabel Is Nothing Then
For Each itemCBLSZ In CheckBoxListSize.Items
If CheckBoxDLatLoad.Checked = True Then
If itemCBLSZ.Selected = True Then
URL = ImageURL + itemCBLSZ.Value + objfile_pathLabel.Text
wc.DownloadFile(URL, ImageTMDbPosterFolder + itemCBLSZ.Value + objfile_pathLabel.Text)
End If
End If
strHyperLinkNmae = "HyperLink" + Right(itemCBLSZ.Value, Len(itemCBLSZ.Value) - 1)
objHyperLink = e.Item.FindControl(strHyperLinkNmae)
objHyperLink.NavigateUrl = ImageURL + itemCBLSZ.Value + objfile_pathLabel.text
Next
End If
wc.Dispose()
End Sub
Protected Sub ButtonDownload_Click(sender As Object, e As EventArgs) Handles ButtonDownload.Click
LabelDownloadStatus.Text = ""
Dim ImageURL As String = ConfigurationManager.AppSettings("ImageURL")
Dim ImageTMDbPosterFolder As String = ConfigurationManager.AppSettings("ImageTMDbPosterFolder")
Dim objfile_pathLabel As New Object
Dim wc As New System.Net.WebClient()
Dim URL As String
Dim strDLStatus As String = ""
For Each itemLV In ListView1.Items
objfile_pathLabel = itemLV.FindControl("file_pathLabel")
If Not objfile_pathLabel Is Nothing Then
For Each itemCBL In CheckBoxListSize.Items
If itemCBL.Selected = True Then
URL = ImageURL + itemCBL.Value + objfile_pathLabel.Text
wc.DownloadFile(URL, ImageTMDbPosterFolder + itemCBL.Value + objfile_pathLabel.Text)
strDLStatus = ""
End If
Next
End If
Next
wc.Dispose()
LabelDownloadStatus.Text = strDLStatus
End Sub
Protected Sub CheckBoxSize_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBoxSize.CheckedChanged
For Each item In CheckBoxListSize.Items
If CheckBoxSize.Checked = True Then
item.Selected = True
Else
item.Selected = False
End If
Next
End Sub
End Class
Partial Class ListViewPosterDL
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
LabelDownloadStatus.Text = ""
End Sub
Protected Sub ListView1_ItemDataBound(sender As Object, e As ListViewItemEventArgs) Handles ListView1.ItemDataBound
Dim ImageURL As String = ConfigurationManager.AppSettings("ImageURL")
Dim ImageTMDbPosterFolder As String = ConfigurationManager.AppSettings("ImageTMDbPosterFolder")
Dim objfile_pathLabel As New Object
Dim objHyperLink As New Object
Dim strHyperLinkNmae As String
Dim URL As String
Dim wc As New System.Net.WebClient()
objfile_pathLabel = e.Item.FindControl("file_pathLabel")
If Not objfile_pathLabel Is Nothing Then
For Each itemCBLSZ In CheckBoxListSize.Items
If CheckBoxDLatLoad.Checked = True Then
If itemCBLSZ.Selected = True Then
URL = ImageURL + itemCBLSZ.Value + objfile_pathLabel.Text
wc.DownloadFile(URL, ImageTMDbPosterFolder + itemCBLSZ.Value + objfile_pathLabel.Text)
End If
End If
strHyperLinkNmae = "HyperLink" + Right(itemCBLSZ.Value, Len(itemCBLSZ.Value) - 1)
objHyperLink = e.Item.FindControl(strHyperLinkNmae)
objHyperLink.NavigateUrl = ImageURL + itemCBLSZ.Value + objfile_pathLabel.text
Next
End If
wc.Dispose()
End Sub
Protected Sub ButtonDownload_Click(sender As Object, e As EventArgs) Handles ButtonDownload.Click
LabelDownloadStatus.Text = ""
Dim ImageURL As String = ConfigurationManager.AppSettings("ImageURL")
Dim ImageTMDbPosterFolder As String = ConfigurationManager.AppSettings("ImageTMDbPosterFolder")
Dim objfile_pathLabel As New Object
Dim wc As New System.Net.WebClient()
Dim URL As String
Dim strDLStatus As String = ""
For Each itemLV In ListView1.Items
objfile_pathLabel = itemLV.FindControl("file_pathLabel")
If Not objfile_pathLabel Is Nothing Then
For Each itemCBL In CheckBoxListSize.Items
If itemCBL.Selected = True Then
URL = ImageURL + itemCBL.Value + objfile_pathLabel.Text
wc.DownloadFile(URL, ImageTMDbPosterFolder + itemCBL.Value + objfile_pathLabel.Text)
strDLStatus = ""
End If
Next
End If
Next
wc.Dispose()
LabelDownloadStatus.Text = strDLStatus
End Sub
Protected Sub CheckBoxSize_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBoxSize.CheckedChanged
For Each item In CheckBoxListSize.Items
If CheckBoxSize.Checked = True Then
item.Selected = True
Else
item.Selected = False
End If
Next
End Sub
End Class
テスト時にフォルダからダウンロードした画像を一括で削除するPowerShellスクリプトを使用した。
get-childitem D:\TMDbPoster\*.jpg -recurse | remove-item
コメント
コメントを投稿