2014-01-04 2 views
0

Я унаследовал этот сайт и имел проблемы с загрузкой файлов. Файлы, такие как .pdf, .doxs, .txt, сохраняются в Sql как изображение. Элементы управления datalist используются с элементами управления a href, чтобы просмотреть его/загрузить, но он не работает. И я понимаю, что управление a href не является надлежащим контролем, но не уверен, какой контроль использовать.Загрузка файла из базы данных не работает

Вот ASPX разметка:

<asp:DataList ID="DataList2" runat="server" DataSourceID="SqlDataSource2" DataKeyField="fileId"> 
    <ItemTemplate> 
    <a href='<%# "~/UserControls/FileFetch.ashx?fileId=" + Convert.ToString(Eval("fileId")) %>' target="_blank"> 
     <%# Convert.ToString(Eval("fileName"))%></a> 
    </ItemTemplate> 
</asp:DataList> 
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:ClubSiteDB %>" 
    SelectCommand="SELECT [fileId], [fileName], [postedBy] FROM [FilesLibrary]">     
</asp:SqlDataSource> 

Вспомогательный файл с именем FileFetch.ashx используется для получения файла:

<%@ WebHandler Language="C#" Class="FileFetch" %> 

using System; 
using System.Web; 
using System.Data.SqlClient; 
using System.Data; 
using System.IO; 

public class FileFetch : IHttpHandler 
{ 
    const int BUFFERSIZE = 1024; 

    public bool IsReusable 
    { 
     get 
     { 
      return true; 
     } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     HttpResponse response = context.Response; 
     HttpRequest request = context.Request; 
     response.ContentType = "response.ContentType"; 
     response.Cache.SetCacheability(HttpCacheability.Public); 
     response.BufferOutput = false; 
     writeSingleImage(Convert.ToInt32(request.QueryString["fileId"]), response.OutputStream); 
     response.End(); 
    } 

    public void writeSingleImage(int fileId, Stream output) 
    { 
     string cxnstr = System.Configuration.ConfigurationManager.ConnectionStrings["ClubSiteDB"].ConnectionString; 
     SqlConnection connection = new SqlConnection(cxnstr); 
     string query; 
     query = "SELECT fileData FROM dbo.FilesLibrary where [email protected]"; 

     SqlCommand command = new SqlCommand(query, connection); 
     SqlParameter param0 = new SqlParameter("@fileId", SqlDbType.Int); 
     param0.Value = fileId; 
     command.Parameters.Add(param0); 
     connection.Open(); 

     byte[] d = ((byte[])(command.ExecuteScalar())); 
     output.Write(d, 0, d.Length); 
     connection.Close(); 
    } 

}

+0

Что такое downvote? – Risho

+0

Какая ошибка? Вы проследили, в какой строке это происходит? – Damon

+0

Я получаю: ' Ресурс не найден. Описание: HTTP 404. Ресурс, который вы ищете (или его зависимости), мог быть удален, изменилось его имя или временно недоступно. Просмотрите следующий URL-адрес и убедитесь, что оно написано правильно. Запрошенный URL:/Test/~/UserControls/FileFetch.ashx'. Но в базе данных есть запись с конкретным идентификатором. Также отладчик никогда не входит в файл FileFetch.ashx. – Risho

ответ

1

Я собираюсь взять сделайте это и скажите, что вам необходимо изменить свой тег Anchor следующим образом:

<a href='<%# Page.ResolveUrl("~/UserControls/FileFetch.ashx?fileId=" + Convert.ToString(Eval("fileId"))) %>' target="_blank"> 

Ссылка MSDN на метод Page.ResolveUrl - here. Страница наследуется от Control, поэтому ссылка ссылается на Control.ResolveUrl.

Я только что видел, что другая альтернатива - добавить runat="server" в тег Anchor, чтобы превратить его в серверный элемент управления.

+0

Ну, это пошло немного дальше и получило фактические данные, к сожалению, что было показано, был jibrish-код .pdf, а не правильно сделанный pdf-файл. – Risho

+0

Но ссылка сейчас работает как минимум и находит файл ashx? – Damon

+0

Ну да, это правда. – Risho

Смежные вопросы