0

我正在一个需要上传/下载功能的网站上工作。上传工作正常,但是当我按下下载上传的文件时,几乎没有任何反应。

//Upload
protected void btnUpload_Click(object sender, EventArgs e)
        {
            string filename = Path.GetFileName(fileUpload1.PostedFile.FileName);
            fileUpload1.SaveAs(Server.MapPath("Files/" + filename));
            con.Open();
            SqlCommand cmd = new SqlCommand("insert into FilesTable(FileName,FilePath) values(@Name,@Path)", con);
            cmd.Parameters.AddWithValue("@Name", filename);
            cmd.Parameters.AddWithValue("@Path", "Files/" + filename);
            cmd.ExecuteNonQuery();
            con.Close();
            BindGridviewData();
        }
//Download
 protected void gvDetails_SelectedIndexChanged(object sender, EventArgs e)
        {
            SqlCommand com = new SqlCommand("select FileName,FilePath from FilesTable where Id=@Id", con);
            com.Parameters.AddWithValue("Id", gvDetails.SelectedRow.Cells[1].Text);
            SqlDataReader dr = com.ExecuteReader();

            if (dr.Read())
            {
                Response.Clear();
                Response.Buffer = true;

                Response.ContentType = dr["type"].ToString();
                Response.AddHeader("content-disposition", "attachment;filename=" + dr["Name"].ToString());
                Response.Charset = "";
                Response.Cache.SetCacheability(HttpCacheability.NoCache);
                Response.BinaryWrite((byte[])dr["data"]);
                Response.End();
            }
}
4

1 回答 1

0

您的代码几乎没有问题:

  1. 您的select查询仅返回FileNameFilePath,但您还尝试从数据库中检索类型数据。您可以在表中添加一个额外的列来存储文件类型,因为您的代码已经将上传的文件保存在Files 文件夹中,然后您可以使用dr["type"]

  2. 您需要使用相同的文件路径进行下载以及用于保存,在数据库中存储绝对路径或相对路径:

    // Uploading
    string filePath = Server.MapPath("Files/" + filename); // Absolute path
    or 
    string filePath = "Files/" + filename; // Relative path
    ...
    cmd.Parameters.AddWithValue("@Path", filePath);
    
    // Downloading
    string filePath = dr["FilePath"]; // Absolute path
    or
    string filePath = Server.MapPath(dr["FilePath"]); // Relative path
    
  3. 如果文件保存在文件夹而不是数据库中,则将其内容作为字节File读取,以便使用或等发送给客户端FileStream

    // ReadAllBytes throws memory exception for large files
    byte[] fileData = File.ReadAllBytes(filePath); 
    
  4. select列表包含FileName作为列名,而不仅仅是Name,替换dr["Name"]dr["FileName"]

于 2013-07-17T18:54:31.303 回答