Grid-Code Ответов: 1

Скачать файл пользователя SQL-сервера ссылка


Всем Привет

Занят разработкой сервера документов - хранением файлов на сервере varbinary format и задавался вопросом, Можно ли создать ссылку для загрузки аналогично Dropbox, Onedrive ... для конечного пользователя иметь возможность получать ссылку по электронной почте - это может быть несбыточной мечтой, так как Север не основан на облаке, - но, может быть, это возможно?

с уважением
Ричард

Что я уже пробовал:

Поиск в Google - нет связанных тем

F-ES Sitecore

Да, это возможно. Если вам нужны пользовательские или временные ссылки, то у вас есть таблица со всеми допустимыми путями ссылок и идентификатором файла, для которого она предназначена. Когда вы создаете ссылку, создайте для нее случайный ключ (или используйте GUID), сохраните его в своей таблице, а когда кто-то использует его, найдите идентификатор файла, для которого он предназначен, и загрузите его. Вам понадобится задача очистки, чтобы очистить ссылки после определенного возраста. Если вам не нужны временные ссылки, то ваша система загрузки должна иметь уникальный url-адрес для каждого файла, поэтому просто отправьте им его.

Grid-Code

хороший день

Очень ценю, действительно, пересмотрю ваш код. К счастью, полная база данных работает с Guid, так что все хорошо до сих пор.

Ричард

CHill60

Чтобы участник был уведомлен о вашем ответе, вам нужно использовать ссылку "ответить" рядом с его постом

1 Ответов

Рейтинг:
0

OriginalGriff

F-ES Sitecore прав, это возможно.
Это код, который я использую:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="wm5ftdl.aspx.cs" Inherits="wm5ftdl" %>

<%  
    // Send a download file to the client given the filename.    
    string guid = Request.QueryString["file"];
    string fileName = "ERROR";
    byte[] data = new byte[] { 0, 0, 0, 0 };
    string strCon = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["DownloadDatabase"].ConnectionString;
    using (System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(strCon))
        {
        con.Open();
        string strcmd = "SELECT [iD] ,cn.[fileName],[description] ,[dataContent] ,[version] " +
                        "FROM dlContent cn " +

                        "WHERE cn.iD=@ID";
        using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(strcmd, con))
            {
            cmd.Parameters.AddWithValue("@ID", guid);
            using (System.Data.SqlClient.SqlDataReader r = cmd.ExecuteReader())
                {
                if (r.Read())
                    {
                    fileName = (string) r["filename"];
                    data = (byte[]) r["dataContent"];
                    }
                }
            }
        }
    Response.Clear();
    Response.AddHeader("Cache-Control", "no-cache, must-revalidate, post-check=0, pre-check=0");
    Response.AddHeader("Pragma", "no-cache");
    Response.AddHeader("Content-Description", "File Download");
    Response.AddHeader("Content-Type", "application/force-download");
    Response.AddHeader("Content-Transfer-Encoding", "binary\n");
    Response.AddHeader("content-disposition", "attachment;filename=" + fileName);
    Response.BinaryWrite(data);
    //Response.WriteFile("wm5ftdata/" + fileName);
    Response.End();  
%>
Он идет в файле ASPX, и я предоставляю ссылку GUID id:
/// <summary>
/// On page load, fill out the Download table
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Page_Load(object sender, EventArgs e)
    {
    try
        {
        List<Downloadable> downloads = GetDownloadList();
        foreach (Downloadable dl in downloads)
            {
            HtmlTableRow row = new HtmlTableRow();
            HtmlTableCell cell = new HtmlTableCell();
            cell.InnerHtml = "<a href=\"wm5ftdl.aspx?file=" + dl.Id + "\" target=\"_blank\">" + dl.FileName + "</a>";
            row.Cells.Add(cell);
            tbDownloads.Rows.Add(row);
            }
        }
    catch (Exception ex)
        {
            HtmlTableRow row = new HtmlTableRow();
            HtmlTableCell cell = new HtmlTableCell();
            cell.InnerHtml = ex.ToString();
            row.Cells.Add(cell);
            tbDownloads.Rows.Add(row);

        }
    }
/// <summary>
/// Returns the list of available files, and their indexes.
/// Note that this only lists the Latest version: not all files and versions.
/// </summary>
/// <returns></returns>
private List<Downloadable> GetDownloadList()
    {
    List<Downloadable> list = new List<Downloadable>();
    string strCon = ConnectionStrings.Download;
    using (SqlConnection con = new SqlConnection(strCon))
        {
        con.Open();
        // Get only the file Ids with the highest version number.
        string strcmd = "SELECT [iD] ,cn.[fileName],[description] ,[version], [uploadedOn], [uploadedBy], [downloadUserOnly] " +
                        "FROM dlContent cn " +
                        "INNER JOIN " +
                        "( SELECT filename, MAX(Version) AS maxver " +
                        "  FROM dlContent " +
                        "  GROUP BY filename" +
                        ") gcn ON cn.filename = gcn.filename " +
                        "         AND cn.version = gcn.maxver";
        using (SqlDataAdapter da = new SqlDataAdapter(strcmd, con))
            {
            DataTable dt = new DataTable();
            da.Fill(dt);
            foreach (DataRow dr in dt.Rows)
                {
                list.Add(new Downloadable(dr));
                }
            }
        }
    return list;
    }
Это предотвращает необходимость прямого доступа к БД с минимумом безопасности.