Member 11848664 Ответов: 2

Не перезаписывайте файл, загруженный через элемент управления fileupload


я не хочу перезаписывать файл, когда папка существует с тем же именем файла.пожалуйста, помогите мне

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

foreach (HttpPostedFile postedFile in FileUpload1.PostedFiles)
    {
        string filename = Path.GetFileName(postedFile.FileName);
        postedFile.SaveAs(Server.MapPath("SiteLayout/" + filename));
        var extension = Path.GetExtension(filename);
        var nameWithoutExtension = Path.GetFileNameWithoutExtension(filename);
        var i = 1;
        while (File.Exists("SiteLayout/" + filename))
        {
            filename = nameWithoutExtension.Trim() + " (" + i + ")" + extension;
            i++;
        }

        using (Stream fs = postedFile.InputStream)
        {
            using (BinaryReader br = new BinaryReader(fs))
            {
                using (SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString))
                {
                    string query = "insert into Site_Layout (ID,File_Path,Image_Path) values (@ID, @File_Path,@Image_Path)";
                    using (SqlCommand cmd = new SqlCommand(query))
                    {
                        cmd.Connection = con;
                        cmd.Parameters.AddWithValue("@File_Path", filename);
                        cmd.Parameters.AddWithValue("@Image_Path", "SiteLayout/" + filename);
                        cmd.Parameters.AddWithValue("@ID", TextBox1.Text);
                        con.Open();
                        cmd.ExecuteNonQuery();
                        Label26.Visible = true;
                        Label26.Text = "File Uploaded Successfully";
                        con.Close();
                    }
                }
            }
        }
    }
    Label26.Visible = true;
   Label26.Text = "File Uploaded Successfully";

}

2 Ответов

Рейтинг:
1

OriginalGriff

Проблема в том, что когда пользователь загружает файл, его имя вполне может конфликтовать с файлом другого пользователя с тем же именем - множество людей используют один и тот же набор имен файлов каждый день!

Способ обойти это - сохранить пользователя и имя файла пользователя в БД, а сам Файл Сохранить как имя файла Guid: bb5a84b2-f9b6-47ae-98e1-25df6344788a.upload или что-то похожее. Затем я сохраняю Guid в БД, чтобы я мог перекрестно ссылаться на имя файла, которое хочет пользователь, на "фактическое" имя файла в файловой системе.
Когда пользователь запрашивает файл, я делаю это через ASPX и строку запроса, содержащую значение Guid:

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

<%  
    // 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.End();  
%>


Рейтинг:
0

Member 11848664

это не решение для хранения имени файла в БД...
я просто хочу остановить перезапись файла, который уже существует в папке с тем же именем..
я использую код, но не знаю, почему он не работает...


raju melveetilpurayil

Поставить точки останова и отлаживать код.