【问题标题】:Pass file name from file upload control to filestream将文件名从文件上传控件传递到文件流
【发布时间】:2010-08-19 10:36:20
【问题描述】:
    SqlConnection conn = new SqlConnection("Data Source=DDPRO8-WIN7X86\\SQLEXPRESS;Initial Catalog=mp3bytes;Persist Security Info=True;Integrated security=true; User ID=; Password=;");
    SqlCommand cmd = null;
    SqlParameter param = null;
    cmd = new SqlCommand(" INSERT INTO mp3_bytes (songs) " + " Values (@songs) ", conn);
    FileStream fs = null;

    string path = fileUpload.FileName;
    fs = new FileStream(path, FileMode.Open, FileAccess.Read);

    Byte[] song = new Byte[fs.Length];
    fs.Read(song, 0, song.Length);
    fs.Close();
    param = new SqlParameter("@songs", SqlDbType.VarBinary, song.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, song);
    cmd.Parameters.Add(param);
    conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();

fileUpload 是文件上传控件。我正在上传一个 mp3 文件。 当我执行此操作时,我找不到文件'',如何将上传的文件名从上传文件控件传递给文件流?

【问题讨论】:

    标签: c# upload mp3


    【解决方案1】:

    使用fileUpload.PostedFile.FileName

    还最好检查是否有使用fileUpload.HasFile 属性上传的文件。您还可以通过检查fileUpload.PostedFile.ContentLength > 0 来防止零长度文件。

    编辑:刚刚意识到你的错误

    上传的文件内容需要你用fileUpload.PostedFile.SaveAs方法保存在磁盘上。上面的文件名属性将为您提供客户端计算机上的文件名,但该文件将不存在于服务器上。您需要将其保存在服务器上的任何位置。例如,

    var path = Path.Combine(tempDirectory, fileUpload.PostedFile.FileNam);
    fileUpload.PostedFile.SaveAs(path);
    

    这会将上传的文件放在服务器上的临时目录中。您也可以使用PostedFile.InputStream 读取文件内容。

    fs = new FileStream(path, FileMode.Open, FileAccess.Read); 将永远无法工作,因为 Web 服务器计算机上不存在文件。

    编辑:基于您的示例代码

    删除FileStream fs = null;并替换

    fs = new FileStream(path, FileMode.Open, FileAccess.Read);
    

    var fs = uploadFile.PostedFile.InputStream;
    

    这应该可以解决问题。

    【讨论】:

    • 很高兴它可以工作,但您真的不应该在数据库中存储如此大的二进制对象。将它们存储在磁盘上,然后将文件名/位置存储在数据库中怎么样?
    【解决方案2】:

    如果您确实需要使用 FileStream,那么您需要将 FileMode 设置为 Create 而不是 Open,因为您不是在打开文件,而是在创建一个文件。

    fs = new FileStream(path, FileMode.Create);
    

    编辑:但是,正如 VinayC 所说,SaveAs() 为您完成了所有艰苦的工作!

    编辑:看起来您正在尝试将文件保存到磁盘,然后从文件中读取字节以传递给 sql。您可以通过从FileUpload 控件获取FileBytes 来绕过该保存/读取部分。

    SqlConnection conn = new SqlConnection("Data Source=DDPRO8-WIN7X86\\SQLEXPRESS;Initial Catalog=mp3bytes;Persist Security Info=True;Integrated security=true; User ID=; Password=;");
    SqlCommand cmd = null;
    SqlParameter param = null;
    cmd = new SqlCommand(" INSERT INTO mp3_bytes (songs) " + " Values (@songs) ", conn);
    
    param = new SqlParameter("@songs", SqlDbType.VarBinary, fileUpload.FileBytes.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, fileUpload.FileBytes);
    cmd.Parameters.Add(param);
    conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-21
      • 1970-01-01
      • 2018-03-20
      • 2020-03-11
      相关资源
      最近更新 更多