【发布时间】:2014-02-25 18:07:50
【问题描述】:
我正在使用 asp.net C# 文件上传。我遇到了一个问题,即当我上传图片并将其存储在指定的文件夹中时,刷新页面后,图片再次上传的次数与页面刷新次数一样多。我尝试启用和禁用 ViewState 选项,但同样的问题仍然存在。我已经对我的功能进行了编码,当上传图片时,它将立即获得一个唯一的名称,因此图片不会被覆盖。任何人都可以解释如何控制这种行为,以便只在指定的上传按钮上上传图片,而不是通过刷新页面。 以下是我正在使用的主要代码:
protected void btnUpload_Click(object sender, EventArgs e)
{
if ((Session["Img1"] != null) && (Session["Img2"] != null) && (Session["Img3"] != null) && (Session["Img4"] != null))
{
lblUploadMsg.Text = "You cannot upload more than 4 pictures";
return;
}
if (FileUpload1.HasFile)
{
string fileExtension = System.IO.Path.GetExtension(FileUpload1.FileName);
if (fileExtension.ToLower() == ".jpg")
{
int fileSize = FileUpload1.PostedFile.ContentLength;
if (FileUpload1.PostedFile.ContentLength < 2097152)
{
//FileUpload1.SaveAs(Server.MapPath("~/Temp/" + FileUpload1.FileName));
//Response.Write("Successfully Done");
string sp = Server.MapPath("~/ItemPictures/");
String fn = Guid.NewGuid().ToString() + FileUpload1.FileName.Substring(FileUpload1.FileName.LastIndexOf("."));
if (sp.EndsWith("\\") == false)
sp += "\\";
sp += fn;
FileUpload1.PostedFile.SaveAs(sp);
lblUploadMsg.ForeColor = System.Drawing.Color.Green;
lblUploadMsg.Text = "Picture Uploaded succefully. You can upload upto 4 pictures";
Aziz.InnerHtml += "Image saved\n";
if (Session["Img1"] == null)
{
Session["Img1"] = "~/ItemPictures/" + fn;
}
else if (Session["Img2"] == null)
{
Session["Img2"] = "~/ItemPictures/" + fn;
}
else if (Session["Img3"] == null)
{
Session["Img3"] = "~/ItemPictures/" + fn;
}
else if (Session["Img4"] == null)
{
Session["Img4"] = "~/ItemPictures/" + fn;
}
}
else
{
lblUploadMsg.Text = "Maximum 2MB files are allowed";
}
}
else
{
lblUploadMsg.Text = "Only JPG files are allowed";
}
}
else
{
lblUploadMsg.Text = "No File was Selected";
}
ShowAvailblImgs();
}
private void ShowAvailblImgs()
{
if (Session["Img1"] != null)
{
Image1.ImageUrl = (string)Session["img1"];
Image1.Width = 130;
Image1.Height = 130;
Image1.Visible = true;
}
else
Image1.Visible = false;
if (Session["Img2"] != null)
{
Image2.ImageUrl = (string)Session["img2"];
Image2.Width = 130;
Image2.Height = 130;
Image2.Visible = true;
}
else
Image2.Visible = false;
if (Session["Img3"] != null)
{
Image3.ImageUrl = (string)Session["img3"];
Image3.Width = 130;
Image3.Height = 130;
Image3.Visible = true;
}
else
Image3.Visible = false;
if (Session["Img4"] != null)
{
Image4.ImageUrl = (string)Session["img4"];
Image4.Width = 130;
Image4.Height = 130;
Image4.Visible = true;
}
else
Image4.Visible = false;
}
【问题讨论】:
-
您可以缓存上传文件的 MD5 校验和。对于新上传,请检查上传文件的 MD5。您还可以在页面的隐藏字段中添加令牌。如果在缓存中找不到提交的令牌,您可以保存图像。如果找到,则用户已经提交了文件。成功上传后,用户将需要一个新令牌。
-
感谢您的推荐。如果有人知道,我仍在寻找其他建议。
-
如果您使用
<input type="file"/>,您会遇到完全相同的问题 -
事实上,请记住,这与人们在您发布表单数据以购买新商品后刷新页面几乎相同的普遍问题。您必须确保帖子不重复。
-
最简单的方法可能是只做一个重定向作为对文件上传 POST 的响应。如果用户在重定向后刷新,浏览器将执行 GET。这是 ASP.NET MVC 中常见的 GET/POST/REDIRECT/GET 模式。如果您的特定情况允许,那可能是最简单的解决方法。