我有一个场景,我让用户选择要上传到他/她在我的网页上的用户个人资料的图片。我正在为我的网站使用.net的MVC3架构。我需要的是图像在他选择他想要的图像之后但在我将其存储在数据库之前显示在页面上。我四处搜索并最终尝试了这个,我的一个朋友说他为他工作了:
在视图中我试过:
<div class="floatRight">
<a onclick="opendialogbox('imageLoad2');" style="cursor: pointer">Photo</a>
<img src="… " width="16" height="16" id="imgThumbnail2" alt="photo" />
<input type="file" name="imageLoad2" accept="image/*" id="imageLoad2" onchange="ChangeImage('imageLoad2','#imgThumbnail2')" hidden="hidden" />
</div>
<script type="text/javascript">
function opendialogbox(inputid) {
document.getElementById(inputid).click();
}
function ChangeImage(fileId, imageId) {
var ext = document.getElementById(fileId).value.match(/\.(.+)$/)[1];
switch (ext.toLowerCase()) {
case 'jpg':
case 'bmp':
case 'png':
case 'gif':
case 'jpeg':
{
var myform = document.createElement("form");
myform.style.display = "none";
myform.action = "/ImagePreview/AjaxSubmit";
myform.enctype = "multipart/form-data";
myform.method = "post";
var imageLoad;
var imageLoadParent;
//test browser used then submit form
$(myform).ajaxSubmit({ success:
function (responseText) {
var d = new Date();
$(imageId)[0].src = "/ImagePreview/ImageLoad?a=" + d.getMilliseconds();
if (document.all || is_chrome)//IE
imageLoadParent.appendChild(myform.firstChild);
else//FF
document.body.removeChild(myform);
}
});
}
break;
default:
alert('Error, please select an image.');
}
}
</script>
在我试过的控制器中:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AjaxSubmit(int? id)
{
Session["ContentLength"] = Request.Files[0].ContentLength;
Session["ContentType"] = Request.Files[0].ContentType;
byte[] b = new byte[Request.Files[0].ContentLength];
Request.Files[0].InputStream.Read(b, 0, Request.Files[0].ContentLength);
Session["ContentStream"] = b;
HttpPostedFileBase file = Request.Files[0];
string myFilePath = Server.MapPath(Url.Content("~/Content/themes/base/images/Auxiliar.png"));
file.SaveAs(myFilePath);
return Content(Request.Files[0].ContentType + ";" + Request.Files[0].ContentLength);
}
public ActionResult ImageLoad(int? id)
{
byte[] b = (byte[])Session["ContentStream"];
int length = (int)Session["ContentLength"];
string type = (string)Session["ContentType"];
Response.Buffer = true;
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = type;
Response.BinaryWrite(b);
Response.Flush();
Response.End();
Session["ContentLength"] = null;
Session["ContentType"] = null;
Session["ContentStream"] = null;
return Content("");
}
现在所有这些我觉得有道理但是当我在我的网站上尝试它时,方法永远不会到达服务器(我在控制器中的两个方法的开头放置了一个断点)。我还使用firefox的firebug来跟踪页面上的脚本,直到它到达该行:
$(myform).ajaxSubmit({ success:
function (responseText) {
var d = new Date();
$(imageId)[0].src = "/ImagePreview/ImageLoad?a=" + d.getMilliseconds();
if (document.all || is_chrome)//IE
imageLoadParent.appendChild(myform.firstChild);
else//FF
document.body.removeChild(myform);
}
});
这里继续但从未进入成功状态。我认为这可能是页面上包含的JQuery版本的一个问题,并注意到我的朋友网站包括:jquery-1.5.1.min.js,jquery-1.3.2.js和jquery_form.js
我将这些添加到我的网站(使用jquery-1.7.2.min.js),但问题仍在继续。不确定是否包含各种版本的jquery会导致与方法发生某种冲突,或者问题是否存在于其他地方。
我非常感谢有关此事的任何帮助。 提前谢谢。
答案 0 :(得分:0)
Donnie,现在仍难以推断问题所在,但您可以采取一些措施来确定问题的确切性质。
首先,您正在处理成功条件,但您还需要使用与上面所写的类似的anon函数来处理错误条件。 http://api.jquery.com/jQuery.ajax/有一些关于此的信息,但基本上你会写:
$(myform).ajaxSubmit({ success: function (responseText) {
// your success method
},
error: function (responseText) {
// your error method
}
});
接下来,FireBug非常棒,但您也希望使用它的网络监控功能,而不仅仅是脚本调试器。可能有一个非常相关的500或404回到你那里,你不知道。
如果是404,则可能与此行有关:
myform.action = "/ImagePreview/AjaxSubmit";
我通常新建一个var并让MVC像这样构建我的动作URL:
var actionUrl = '@Url.Action("Action", "Controller")'
作为最佳实践,我通常将此URL作为视图模型的一部分注入,或者将其存储在隐藏字段的视图中,但这也没关系。
希望这些提示有所帮助。欢呼声。