我在前台用AJAX向一个一般处理程序发了一个图片路径(post方式)(postfile控件),然后在这个一般处理程序中对此图片的路径进行文件流解析保存在服务器的一个文件夹里!并在数据库中保存里图片的路径,实现了图片的上传,可以很多人认为不可以用ajax上传文件,而是用iframe来实现文件上传?这是为什么啊?用AJAX有什么弊端啊?求大神指教!
我看过你的代码了。之前我也写过这样的代码,在本机测试没问题的。但是一旦把网站放到IIS上之后,你就上传不了了。
好多浏览器都出于安全问题的考虑,在弹出框选择文件后,都会把真实的路径隐藏。文件根本上传不到服务器的。
最后被逼无奈,我是采用form表单实现的上传,当然,要把form 的enctype属性设置为multipart/form-data才可以。
这是谁说的,用iframe 比较好? 用那个只不过不用写js程序了而已,也能防止刷新主页面,可以完全用c#在后台写,
没有什么本质上的不同,ajax方式效果还好点呢
大哥啊,你可别忽悠我啊!为什么很多人说AJAX不能上传文件啊!!!什么由于安全性考虑AJAX不能上传文件!我郁闷啊!我那写的AJAX上传文件到底行不行啊!求解!!!有的人结合flash上传文件,到底该怎样啊!!!
@GatewayOne: 单纯的js是不能上传文件,因为上传文件就得有程序和服务器程序打交道,ajax就是和服务器程序打交道,不管是用flash,flex,还是silverlight,只要能和服务器程序通信就行了
@大菜: 那我那个可以啊?
@大菜: 你在看看我下面的代码,行不行啊?
我觉得你就没有写一个出来写个就知道了
我写的啊!就是用上面的方式写的,图片也能保存在服务器上的文件夹里啊!我真的实现了啊!求大哥相信啊!
@GatewayOne: 恩 信了
@随静而动:
1 public void ProcessRequest(HttpContext context) 2 { 3 string img = context.Request.Form["img"]; //图片路径 4 string id = context.Request.Form["id"]; //用户ID 5 if (img != null && id != null) 6 { 7 int i = Convert.ToInt32(id); 8 string sq = Path.GetFileNameWithoutExtension(img) + "zwh" + Path.GetExtension(img); 9 string pathee = HttpContext.Current.Server.MapPath("photo"); 10 string path = pathee + "\\" + sq; 11 using (Stream s = File.OpenRead(img)) 12 { 13 using (Stream s2 = File.OpenWrite(path)) 14 { 15 byte[] b = new byte[1024 * 4 * 4]; 16 int j; 17 while ((j = s.Read(b, 0, b.Length)) > 0) 18 { 19 s2.Write(b, 0, j); 20 } 21 } 22 } 23 24 if (new BLL.BBSUser().UpdateImg(path, i) > 0) 25 { 26 context.Response.Write("ok"); 27 context.Response.End(); 28 } 29 else 30 { 31 context.Response.Write("no"); 32 context.Response.End(); 33 } 34 } 35 }
1 function queren() { 2 var id=<%=i %> 3 var file= $("#img1").val(); 4 xhr.open("post", "photo.ashx", true); 5 xhr.onreadystatechange = changing; 6 xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 7 xhr.send("img=" +file+"&id="+id); 8 } 9 function changing() { 10 if (xhr.readystate == 4) { 11 if (xhr.status == 200) { 12 var uo = xhr.responseText; 13 if(uo=="ok") 14 { 15 alert("修改成功!"); 16 } 17 else 18 { 19 alert("修改失败!"); 20 } 21 } 22 else { 23 alert(xhr.status); 24 } 25 } 26 }
@随静而动:
1 public void ProcessRequest(HttpContext context) 2 { 3 string img = context.Request.Form["img"]; //图片路径 4 string id = context.Request.Form["id"]; //用户ID 5 if (img != null && id != null) 6 { 7 int i = Convert.ToInt32(id); 8 string sq = Path.GetFileNameWithoutExtension(img) + "zwh" + Path.GetExtension(img); 9 string pathee = HttpContext.Current.Server.MapPath("photo"); 10 string path = pathee + "\\" + sq; 11 using (Stream s = File.OpenRead(img)) 12 { 13 using (Stream s2 = File.OpenWrite(path)) 14 { 15 byte[] b = new byte[1024 * 4 * 4]; 16 int j; 17 while ((j = s.Read(b, 0, b.Length)) > 0) 18 { 19 s2.Write(b, 0, j); 20 } 21 } 22 } 23 24 if (new BLL.BBSUser().UpdateImg(path, i) > 0) 25 { 26 context.Response.Write("ok"); 27 context.Response.End(); 28 } 29 else 30 { 31 context.Response.Write("no"); 32 context.Response.End(); 33 } 34 } 35 }
楼主你都写出来了还怀疑啊
不是有的人说用AJAX不好传文件的啊?他们结合flash来上传文件,虽然我写的这能实现,但是他们仍说不可以用AJAX实现上传文件,他们说的肯定有道理啊!不然他们不会吃饱了没事做去用flash来实现文件上传(或者别的方式)!我只是不懂为什么不能用AJAX上传,不是能成功吗?郁闷啊。。。。。。
flash 怎么实现的我就不清楚了。如果是用 silverlight 做的话,就是客户端分块上传,首先读取整个文件流,然后每次提交 一定大小的数据,服务器接收到数据就写文件。这样做的好处是能够实现 断点续传,实时的进度条,避免网络不好出现的超时,而且用POST 提交的数据,默认最大只支持4M。
请问使用silverlight的能实现的进度是浏览器读取文件的进度还是服务器上对该文件生成物理文件的进度?因为我最近使用了一些flash的上传插件,据我观察,其进度条都是读取文件的进度,非常快。还有silverlight是直接访问需要存储的文件路径吗?还是后台也有对应的对文件流存储为文件的处理代码。
@牧马:从 silverlight 异步调用服务器端的方法写入文件,到服务器执行完调用 silverlight 的回调方法为一次完整上传,所以进度条的刷新应该放在 服务器执行完调用 silverlight 的回调方法里进行。
大哥,相信自己吧,flash也是一种方式,而且flash可以更好的显示上传进度~
小哥,我懂得!
在客户端角度上看,的确是不支持ajax文件上传的,网上看到的ajax上传都是委ajax,基本原理都是用js创建一个内部窗体iframe,用创建的iframe去提交文件,实现不刷新当前页面的委ajax效果
那我写的这个呢?
看了你帖出來的代碼,我只想說,你這根本就不是上傳文件,大家說不能用ajax上傳文件指的是從本地讀取文件,然後提交的是文件的十進制數據。你這是提交個路徑,然後服務器端操作這個路徑的文件,是兩回事。你是在本機測試讀的是本地文件,如果是服務器上怎麼讀你本地文件。
另外說一下,javascript的ajax是通過xml傳遞數據的,xml是文本格式不是二進制,所以就決定了無法用ajax上傳文件。
那一般都怎么传?
此楼正解,赞一个