将文件名从文件上载控制传递到文件流

时间:2010-08-19 10:36:20

标签: c# upload mp3

    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文件。 当我执行此操作时,我找不到文件'',如何将上传的文件名从上传文件控件传递到文件流?

2 个答案:

答案 0 :(得分:2)

使用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;

这应该可以解决问题。

答案 1 :(得分:0)

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

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

编辑:但是,正如VinayC所说,SaveAs()为你做了所有努力工作!

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

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();