LIstView に表示された画像を インターネットからダウンロードしてファイルに保存する

 

到達点

  • ListView に表示される画像をインターネットからダウンロードして、指定したサーバ上のフォルダにファイルとして保存する。
  • サーバ上の画像保存フォルダは固定する。
  • インターネット上の画像は複数サイズあるので、ダウンロードする画像サイズを選択できるようにする。デフォルトは全サイズ選択状態とする。
  • 選択画像サイズは、一括チェック、一括チェック解除できること。
  • ページ表示時に、自動で画像をダウンロードするかしないか選べるようにする。デフォルトは自動でダウンロードしないとする。
  • ListView の各アイテムには、ダウンロード対象画像へのハイパーリンクをサイズ別に表示する。オリジナルサイズは画像にハイパーリンクを埋め込む。

 

仕様

  • 画像のインターネット上のベースURL、サーバのダウンロード先フォルダは web.config で設定する。
  • 選択画像サイズはチェックボックスリストコントロールを使用する。選択値はコントロールに直接埋め込む。
  • 選択画像サイズを一括チェック、一括チェック解除には、チェックボックスを使用する。
  • ダウンロードボタンで画像をダウンロードする場合は、非同期通信とする。非同期通信中は「ダウンロード中...」を表示し、ダウンロード完了後は「ダウンロード完了」を表示する。なお、「ダウンロード完了」はページロード時に初期化するので、いずれかの画像サイズをチェックした状態で再度ダウンロードを押した場合、今回のダウンロード中も、前回の「ダウンロード完了」が表示されたままになる。
  • 非同期通信には AJAX Extensions の UpdatePanel を使用する。
  • 画像ダウンロードは System.Net の名前空間の WebClient() を使用する。 
  • ページ表示時の画像自動ダウンロードはチェックボックスで判定する。自動ダウンロードにチェックがある場合は、ListView のDataBound イベントで、選択されているダウンロード対象の画像サイズに従い、画像をダウンロードする。

ListViewPosterDL.aspx
03

 

完成イメージ

ダウンロードボタンをクリックすると、インターネットから選択したサイズの画像を非同期でダウンロードする。ここでは横幅が150ピクセルの画像をダウンロードするように選択した。
04
ダウンロード中は UpdateProgress を使用して、ダウンロード中 のメッセージを表示し、ダウンロードが完了するとメッセージは消え、ダウンロード完了 が表示される。
0506

画像はweb.config のappSettings で指定したフォルダに、画像サイズごとに分別されて保存される。横幅150ピクセル以外のフォルダは空。
0708

「ページ表示時に画像をダウンロードする」にチェックを入れると、ページを表示するとき(イベントは ListView の ItemDataBound)に選択されている画像サイズの画像をすべてダウンロードする。ここでは、すべての
画像サイズにチェックを入れ、次ページをクリックした。
09
すると同期通信で画像のダウンロードが開始される。同期通信なので操作は受け付けない。ダウンロードが完了するまで待つ。
10
次ページが表示された。
12
すべての画像サイズの画像がダウンロードされている。
11
1314

 

 

ソース

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>
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

 

テスト時にフォルダからダウンロードした画像を一括で削除するPowerShellスクリプトを使用した。

get-childitem D:\TMDbPoster\*.jpg -recurse | remove-item

コメント

このブログの人気の投稿

ダブルクォーテーションで括られたCSVカ​ンマ区切りテキストファイルを SQL Server で Bulk Insert する方法

PowerShellでTSV/CSVの列を絞り込んで抽出し、(先頭/行末)からN行出力する

IKEAの鏡を壁に取り付ける