none
AJAX上传文件 RRS feed

  • 问题

  • 我在前台用AJAX向一个一般处理程序发了一个图片路径(post方式)(postfile控件),然后在这个一般处理程序中对此图片的路径进行文件流解析保存在服务器的一个文件夹里!并在数据库中保存里图片的路径,实现了图片的上传,可以很多人认为不可以用ajax上传文件,而是用iframe来实现文件上传?这是为什么啊?用AJAX有什么弊端啊?求大神指教!
    • 已移动 Mike Feng 2012年11月16日 17:20 (发件人:.NET Framework 一般性问题讨论区)
    2012年11月16日 10:11

答案

  • 很简单的简单的文件上传的话(不用进度提示的),直接接收POST请求保存即可。

    这个上传进度通知倒是很好的一个想法。

    然而使用全局变量是不现实的,除非网站只有一个用户。还有,Session+Cookies的方法也没看出端倪。。。

    其实实现思路是很简单的,只要转变Web服务为多线程便很容易实现。用delegate去委派任务,一个线程用于上传,一个线程用户回调上传进度。然后定时前台一个js去提交ajax请求获取当前进度。

    对于楼主刚入门,用控件来完成的话就太简单不过了。推荐Ajax Control Toolkit —— AsyncFileUpload,参考:http://www.cnblogs.com/sun8134/archive/2009/10/13/1582374.html


    Willin.org

    2012年11月20日 3:22

全部回复

  • 我移到web论坛去了 

    Mike Feng
    MSDN Community Support | Feedback to us
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年11月16日 17:19
  • 移到web论坛?什么意思啊?
    2012年11月17日 3:25
  • 移到web论坛?什么意思啊?

    你这个问题属于Web开发方面的,自然MSFT人员会移动这个帖子到合适的地方。

    同时,就我所知——GridView中嵌套FileUpLoad控件,并且置于UpdatePanel(AJAX)是会有问题的。所以不建议这样做。你可以寻求第三方的AJAX上传工具。

    建议参考:http://www.codeproject.com/Articles/16945/Simple-AJAX-File-Upload

    或者你可以使用微软的AJAX扩展库,其中有异步文件上载控件的:

    http://www.cnblogs.com/youring2/archive/2011/04/21/2024314.html


    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年11月17日 3:30
  • 没有用到GridView和FileUpLoad控件啊,用的是html控件filepost啊!
    //这是一般处理程序处理的代码:

    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 }


    2012年11月17日 4:01
  • 可为什么有人说用AJAX不可以上传文件???非得要用flash等其他都能上传文件?郁闷啊~~~~~~~~

    2012年11月17日 12:43
  • AJAX 上传的弊端? 最大弊端就是,后台逻辑设计非常复杂。你不仅要考虑用户启用JS时候的AJAX上传,还要保证用户禁用js的普通post上传。

    另外上传文件接收,不要转换成文件流最好,直接接收。

    AJAX 上传的优势还是有很多的,比如用户体验好,效率高,当然比较保守的做法可以用flash上传。你可以看看QQ邮箱的做法,单个文件上传是AJAX,批量是FLASH。


    www.willin.org

    • 已建议为答案 Willin Wang 2012年11月19日 1:54
    2012年11月19日 1:44
  • 可以看看我写的文章

    http://www.cnblogs.com/cracker/archive/2011/09/21/mvc_upload_progress.html

    Asp.net mvc 3 实现进度条上传思路

    弊端就是程序会复杂一些..


    认真的活,认真的爱!

    2012年11月20日 3:07
    版主
  • 很简单的简单的文件上传的话(不用进度提示的),直接接收POST请求保存即可。

    这个上传进度通知倒是很好的一个想法。

    然而使用全局变量是不现实的,除非网站只有一个用户。还有,Session+Cookies的方法也没看出端倪。。。

    其实实现思路是很简单的,只要转变Web服务为多线程便很容易实现。用delegate去委派任务,一个线程用于上传,一个线程用户回调上传进度。然后定时前台一个js去提交ajax请求获取当前进度。

    对于楼主刚入门,用控件来完成的话就太简单不过了。推荐Ajax Control Toolkit —— AsyncFileUpload,参考:http://www.cnblogs.com/sun8134/archive/2009/10/13/1582374.html


    Willin.org

    2012年11月20日 3:22
  • 请问这个上传文件的控件用的是纯JS+HTML技术吗?据我所知只有XMLHTTPRequst level2 才支持post文件和表单数据,而且IE9是不支持XMLHTTPRequst level2的,那这个用的是什么技术?

    da jia hao!

    2012年11月20日 8:25
  • 我就想知道,使用纯粹的、浏览器原生的JS+HTML技术,能够通过程序上传文件?

    目前我实践过,Chrome浏览器、FireFox浏览器可以通过调用XMLHTTPRequest Level2提供的FormData接口来提交表单数据或者文件,而且不管服务器是什么平台,因为这是标准的HTTP上传协议,和服务器后台无关的。

    而IE9不支持Level2,所以不行?


    da jia hao!

    2012年11月20日 8:29