文件上传/下载失败

时间:2013-07-17 14:07:40

标签: asp.net

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

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

1 个答案:

答案 0 :(得分:0)

您的代码几乎没有问题:

  1. 您的select查询仅返回 FileName FilePath ,但您还尝试检索类型来自数据库的数据。您可以在表格中添加额外的列来存储文件类型,因为您的代码已将上传的文件保存在 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. 如果文件保存在文件夹而不是数据库中,则将其内容读取为 bytes ,以便使用FileFileStream等发送给客户端:

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