我正在一个我需要上传/下载功能的网站上工作。上传工作正常,但是当我按下载上载文件几乎没有任何反应。
//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();
}
}
答案 0 :(得分:0)
您的代码几乎没有问题:
您的select
查询仅返回 FileName 和 FilePath ,但您还尝试检索类型和来自数据库的数据。您可以在表格中添加额外的列来存储文件类型,因为您的代码已将上传的文件保存在 Files 文件夹中,然后您可以使用dr["type"]
您需要使用相同的文件路径进行下载以及用于保存的数据路径,或者在数据库中存储绝对路径或相对路径:
// 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
如果文件保存在文件夹而不是数据库中,则将其内容读取为 bytes ,以便使用File
或FileStream
等发送给客户端:
// ReadAllBytes throws memory exception for large files
byte[] fileData = File.ReadAllBytes(filePath);
select
列表包含 FileName 作为列名,而不只是名称,将dr["Name"]
替换为dr["FileName"]
< / p>