• 乱想(四)


    以前在C#中使用WebClient这个玩意下载过文件和上传过文件,于是想如何在javascript中完成相通的操作?

    要上传一个文件到服务器上,我们的思路应该是将文件序列化或者转成字节流传到服务器上,然后在后台服务中进行解析,我相信后台服务对大家来说都不是问题,如下:

    public class File_WebHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            HttpFileCollection files = context.Request.Files;
    

    if (files.Count > 0) { for (int i = 0; i < files.Count; i++) { HttpPostedFile file = files[i];

    if (file.ContentLength > 0) { sting title = Path.GetFileName(file.FileName); string path = "./demo/" + title; file.SaveAs(System.Web.HttpContext.Current.Server.MapPath(path)); context.Response.Write("{ path: \"" + path + "\", name: \"" + title + "\" }"); } } } }

    刚开始的时候,我想能不能直接,直接使用XMLHttpRequest这个对象的open方法,然后构造一个字符串比如http://localhost/FileUP?Files=Values?,人有的时候是需要冷静的,炸的一想,灵机一动,觉得此法不行,以前用过这种做法,这是因为我的value一般都是字符串或json构成的对象,而如果这样的话,我后台获取也也只是文件的路径而已。

     但是前台的数据如何上去呢?要回答这个问题,就要解决文件怎么才能被序列化?

    在提交数据的时候,没太关注过多的细节,因为我喜欢自己去构造这个URL,所以忽略了form,通常我们提交(使用submit button)时,会把form中的所有表格元素的name与value组成一个queryString,提交到后台,这也就是说form是自动帮我们构造了这个请求的URL,它将Key=value自动添加到我们制定的URL之后。

    在form中添加 enctype="multipart/form-data"就可以解决我所提到的“序列化问题”,当然这肯定比我说复杂,这个也应该有自己的规范,这个东西就是一个编码规范,说明了上传的数据用什么编码,如果想深入这个规范,可以Google或者Baidu。

    在上传文件的时候,可能会遇到数据过大而报错,这是因为ASP.NET允许上传的文件默认是4MB,可以修改web.config文件修改这个的大小,也许你不想这么做,但是也有别的办法。

    http://www.cnblogs.com/fumj/archive/2012/08/05/2623515.html
    Using System.Web.Configuration; void Application_BeginRequest(object sender, EventArgs e) { //本代码的功能是检查页面请求的大小,如果超过了配置文件maxRequestLength的设定值,就提示用户超过了所允许的文件大小。 //从配置文件里得到配置的允许上传的文件大小 HttpRuntimeSection runTime = (HttpRuntimeSection)WebConfigurationManager.GetSection("system.web/httpRuntime"); //maxRequestLength 为整个页面的大小,不仅仅是上传文件的大小,所以扣除 100KB 的大小, //maxRequestLength单位为KB int maxRequestLength = (runTime.MaxRequestLength) * 1024; //当前请求上下文的HttpApplication实例 //HttpContext context = ((HttpApplication)sender).Context; //判断请求的内容长度是否超过了设置的字节数 if (Request.ContentLength > maxRequestLength) { #region 不理解这些代码存在的意义 /* //得到服务对象 IServiceProvider provider = (IServiceProvider)context; HttpWorkerRequest workerRequest = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest)); //检查请求是否包含正文数据 if (workerRequest.HasEntityBody()) { //请求正文数据的长度 int requestLength = workerRequest.GetTotalEntityBodyLength(); //得到加载的初始字节数 int initialBytes = 0; if (workerRequest.GetPreloadedEntityBody() != null) initialBytes = workerRequest.GetPreloadedEntityBody().Length; //检查是否所有请求数据可用 if (!workerRequest.IsEntireEntityBodyIsPreloaded()) { byte[] buffer = new byte[512000]; //设置要接收的字节数为初始字节数 int receivedBytes = initialBytes; //读取数据,并把所有读取的字节数加起来,判断总的大小 while (requestLength - receivedBytes >= initialBytes) { //读取下一块字节 initialBytes = workerRequest.ReadEntityBody(buffer, buffer.Length); //更新接收到的字节数 receivedBytes += initialBytes; } initialBytes = workerRequest.ReadEntityBody(buffer, requestLength - receivedBytes); } } */ #endregion //注意这里可以跳转,可以直接终止;在VS里调试时候得不到想要的结果,通过IIS才能得到想要的结果;FW4.0经典或集成都没问题 Response.Write("请求大小" + Request.ContentLength); Response.End(); } }
  • 相关阅读:
    linux下C语言实现写日志 linux下C语言实现写日志功能(转)
    打开支付宝扫一扫,每天都可以领早餐钱,长期活动真实有效!
    谈谈程序员 35 岁危机,太真实了……
    ELK 搭建 TB 级海量日志监控系统,这个太强了!
    面试官:如果保证数据库和缓存数据的一致性?面试必问……
    Spring Boot 并行任务,这才是优雅的实现方式!
    公司新入职一个中级 Java 开发,4 行代码写出了 3 个异常,我真的服了。。
    IDEA 一键生成 Maven 依赖关系图,太强大了。。
    自从用了灰度发布,睡觉真香!
    牛逼!“京东热” 框架 JDhotkey 开源了...单机 QPS 可达 37 万!!
  • 原文地址:https://www.cnblogs.com/zuiyirenjian/p/3025465.html
Copyright © 2020-2023  润新知