【问题标题】:Don't overwrite file uploaded through FileUpload control不要覆盖通过 FileUpload 控件上传的文件
【发布时间】:2015-09-07 22:25:31
【问题描述】:

使用以下代码:

    protected void Button1_Click(object sender, EventArgs e)
    {
        if (FileUpload1.HasFile)
        {
            string fileExt =
               System.IO.Path.GetExtension(FileUpload1.FileName);

            if (fileExt == ".jpg" || fileExt == ".jpeg" || fileExt == ".gif" || fileExt == ".png")
            {
                try
                {
                    FileUpload1.SaveAs(Server.MapPath("../uploads/originals/" + FileUpload1.FileName));
                    Label1.Text = "File name: " +
                        FileUpload1.PostedFile.FileName + "<br>" +
                        FileUpload1.PostedFile.ContentLength + " kb<br>" +
                        "Content type: " +
                        FileUpload1.PostedFile.ContentType;
                }
                catch (Exception ex)
                {
                    Label1.Text = "ERROR: " + ex.Message.ToString();
                }
            }
            else
            {
                Label1.Text = "Only image files are allowed!";
            }
        }
        else
        {
            Label1.Text = "You have not specified a file.";
        }


    }

我想这样做,如果文件存在,它会更改它的名称,是否有任何内置功能?经典的 ASP 有一个参数,这样当你上传 house.jpg 时,它会再次变成 house(1).jpg 等,这很有用。

【问题讨论】:

    标签: c# asp.net file-upload


    【解决方案1】:

    没有内置任何东西 - 您需要自己制定算法:

    string path = Server.MapPath("../uploads/originals/" + FileUpload1.FileName);
    
    if(!File.Exists(path))
    {
      FileUpload1.SaveAs(path);
    }
    else
    {
      // figure a different file name, perhaps check for existence as well
    }
    

    这也可以构造成一个循环:

    string path = Server.MapPath("../uploads/originals/" + FileUpload1.FileName);
    
    while(File.Exists(path))
    {
      // GetAlternatePath generates a new filename based on the path passed in
      path = GetAlternatePath(path); 
    }
    FileUpload1.SaveAs(path);
    

    【讨论】:

      【解决方案2】:
      var fileName = file.FileName;
      var extension = Path.GetExtension(fileName);
      var nameWithoutExtension = Path.GetFileNameWithoutExtension(fileName);
      
      var i = 1;
      while (File.Exists(uploadFolder + fileName))
      {
          fileName = nameWithoutExtension.Trim() + " (" + i + ")" + extension;
          i++;
      }
      
      file.SaveAs(uploadFolder + fileName);
      

      【讨论】:

        【解决方案3】:

        您可以使用File静态类检查文件是否存在:

        bool exists = System.IO.File.Exists(fileName);
        

        没有内置方法可以给文件名加(1),但是可以使用System.IO.Path.GetRandomFileName方法获取保证唯一的文件名。如果不需要文件名称本身是可读的,那么这可能很有用。

        【讨论】:

          【解决方案4】:

          我有一个小方法,可以通过在它们上添加 (1)、(2) 等来获取这样的唯一文件名:

          public static string GetUniqueFilename(string folder, string postedFileName)
          {
              string fileExtension = postedFileName.Substring(postedFileName.LastIndexOf('.') + 1);
              int index = 2;
          
              while (File.Exists(string.Format("{0}/{1}", folder, postedFileName)))
              {
                  if (index == 2)
                      postedFileName =
                          string.Format("{0} ({1}).{2}",
                                        postedFileName.Substring(0, postedFileName.LastIndexOf('.')),
                                        index,
                                        fileExtension);
                  else
                      postedFileName =
                          string.Format("{0} ({1}).{2}",
                                        postedFileName.Substring(0, postedFileName.LastIndexOf(' ')),
                                        index,
                                        fileExtension);
                  index++;
              }
          
              return postedFileName;
          }
          

          【讨论】:

            【解决方案5】:

            我建议您使用 GUID 标记文件名,以确保每个文件都有唯一的名称。

            使用原始文件名维护数据库,并在文件下载时替换它。

            【讨论】:

              【解决方案6】:

              如果文件存在,为什么不先删除文件,然后调用“SaveAs”方法?

              【讨论】:

                猜你喜欢
                • 2011-11-01
                • 2013-02-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-03-17
                相关资源
                最近更新 更多