2012-05-05 27 views
0

ファイルのダウンロードに問題があります。私はファイル名とそのファイルをダウンロードするためのリンクを示すグリッドを持っています。 これは私のグリッドのコードです。ここでファイルがフォルダからダウンロードされない

<asp:GridView ID="gv7" runat="server" AllowPaging="True" CssClass="tbl_green_parrot" 
PageSize="5" Width="100%" AutoGenerateColumns="False" EmptyDataText="No Scheme data available" DataKeyNames="FilePath" OnPageIndexChanging="gv7_PageIndexChanging"    onrowdatabound="gv7_RowDataBound"> 
    <AlternatingRowStyle CssClass="tbl_green_parrot1" /> 
<FooterStyle CssClass="tbl_green_parrotfoot" /> 
<PagerStyle CssClass="tbl_green_parrotpager" /> 
<SelectedRowStyle CssClass="tbl_green_parrotselect" /> 
<EmptyDataRowStyle CssClass="tbl_green_parrotempty" /> 
<Columns> 
    <asp:TemplateField HeaderText="File Name"> 
    <ItemTemplate> 
    <asp:HyperLink ID="lnkFile" Target="_blank" CausesValidation="false" runat="server" 
    Text='<%# Bind("DisplayName") %>' NavigateUrl='<%# Bind("FilePath") %>' /> 
    </ItemTemplate> 
    </asp:TemplateField> 
    <asp:TemplateField HeaderText="Download" ItemStyle-Width="25px" ItemStyle-HorizontalAlign="Center"> 
    <ItemTemplate> 
    <a id="lnkDLoad" href='<%# Bind("FilePath") %>' runat="server" target="_blank"> 
    <img src="Images/download.png" alt="Download" /> 
    </a> 
    </ItemTemplate> 
    <ItemStyle HorizontalAlign="Center" Width="25px" ></ItemStyle> 
    </asp:TemplateField> 
</Columns> 

私は<a>タグにファイルパスをバインドします。このコードは、Webサイトの同じルートフォルダにファイルがあるときに実行されています。しかし、私がフォルダ内にあるファイルをダウンロードしようとすると、ダウンロードされません。

ダウンロードするための背後にあるコード:

DataTable new_dt = new DataTable(); 
    new_dt.Columns.Add("DisplayName"); 
    new_dt.Columns.Add("FileName"); 
    new_dt.Columns.Add("FilePath"); 
    string Query = "SELECT DisplayName,FilePath,Universal From DistScheme"; 
    dt = DataAccessLayer.DAL.getFromDataTable(Query); 
    string filename = ""; 
    if (dt.Rows.Count > 0) 
    { 
     for (int i = 0; i < dt.Rows.Count; i++) 
     { 
      DataRow new_dr = new_dt.NewRow(); 
      if (dt.Rows[i]["Universal"].ToString() == "False") 
      { 
       filename = DistributorID + "_" + dt.Rows[i]["FilePath"].ToString(); 
      } 
      else 
      { 
       filename = dt.Rows[i]["FilePath"].ToString(); 
      } 
      string filepath = Server.MapPath("Uploads/Scheme/") + filename; 
      if (File.Exists(filepath)) 
      { 
       new_dr["DisplayName"] = dt.Rows[i]["DisplayName"].ToString(); 
       new_dr["FileName"] = filename; 
       new_dr["FilePath"] = filepath; 
       new_dt.Rows.Add(new_dr); 
      } 
     } 
    } 
    gv7.DataSource = new_dt; 
    gv7.DataBind(); 

どのように私はこの問題を解決するのですか?

答えて

0

ファイルパスは「http」から始める必要があります。 extenssionのhttp://domian-name/foldername/filenameのようなファイルパスに完全なパスを含めます。

+0

しかし、このパスを取得するには? – raina

+0

ファイルが保存されているFTP構造で簡単に確認できます。 – Saurabh

+0

私のコードで私は私のファイルのパスを見つけるためにServer.MapPath()メソッドを使用しています。ダウンロード可能ではないファイルの物理パスを提供します。コードからダウンロード可能なパスを取得する方法。これを行うために定義されたメソッドはありますか? – raina

0

タスクを実行するには、グリッドからファイルをダウンロードするには、以下のようにグリッドにテンプレートの列を追加する必要があります。

<asp:TemplateField HeaderText="File" SortExpression="File Path"> 
       <ItemTemplate>      
        <asp:ImageButton ImageUrl="Images/download.png" ID="imgbtnDownload" runat="server" CommandName="DOWNLOAD" Text="GetFile" CommandArgument='<%# Bind("FilePath") %>' ></asp:ImageButton> 
       </ItemTemplate> 
      </asp:TemplateField> 

以下のように、コードビハインドファイルにRow_commandイベントを追加する必要があります。

protected void gv7_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    if (e.CommandName == "DOWNLOAD") 
    { 
    // make sure fileName contains only file name like 'test.pdf' 
     string fileName = Convert.ToString(e.CommandArgument); 

    // make sure filePath contains file path like 'Uploads/Scheme/test.pdf'   
     string filePath = Server.MapPath(Convert.ToString(e.CommandArgument)); 

     Response.Clear(); 
     Response.Buffer = true; 

     // Read the original file from disk 
     FileStream myFileStream = new FileStream(filePath, FileMode.Open); 
     long FileSize = myFileStream.Length; 
     byte[] Buffer = new byte[Convert.ToInt32(FileSize)]; 
     myFileStream.Read(Buffer, 0, Convert.ToInt32(FileSize)); 
     myFileStream.Close(); 
     // Tell the browse stuff about the file 
     Response.AddHeader("Content-Length", FileSize.ToString()); 
     //Response.AddHeader("Content-Disposition", "inline; filename=" & fileneme.Replace(" ", "_")) 
     Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName + ";"); 
     //Response.TransmitFile(fileneme) 
     //Response.ContentType = getMimeType(sExtention, oConnection) 

     // Send the data to the browser 
     Response.BinaryWrite(Buffer); 
     Response.End(); 

    } 
} 

aspxページから画像ボタンをクリックすると、ファイルを開くか保存するかを選択できます。

これはあなたを助けるでしょう..ハッピーコーディング...

関連する問題