分享

goahead上传文件【原创】

 erran 2015-11-13

        以前针对goahead研究过如何使用cookie,如今在使用它进行上传文件时又出现了一点问题,首先,之前goahead在原来的板子跑的时候,上传文件一直正常,使用的mips交叉编译。现在使用arm交叉编译,虽然优化的比较厉害,但是其余功能一切正常,唯独这个上传文件会使webs崩溃。

        对于文件上传需要找到webs.c中的void websReadEvent(webs_t wp),因为我们使用的是method="post" enctype="multipart/form-data",所以处理方式在 case WEBS_POST_CLEN这里,标志为wp->flags & WEBS_MULTIPART_FORM。 这些找到后,就可以通过这条分支来处理保持上传的文件。

        在上面函数里面设置完调试语句后,将程序跑起来,然后看看问题具体产生在何处。发现,while ((rc = websGetInput(wp, &text, &nbytes)) == 0)这里在没有读取完整个文件时,竟然返回-1,返回-1表示读到EOF,或者error,导致下面执行了break,完成对文件的读取操作,接下来又会读出数据,然后整个程序挂掉。 若上传文件正常的话,会一直返回1直到读完整个文件,中途不会返回-1。 那肯定就是这里有问题了。下面就要进到websGetInput()函数里面设置调试语句,并分析。 nbytes = socketRead(wp->sid, buf, len);该处在接收文件时返回0,即没有读到数据,然后程序中对返回0的操作是return -1。ok,情况明朗了,也就是说,在上传文件过程中,有时会读取不到数据,那好,我读不到数据就继续读,怎样解决呢,  return 0;返回0表示未读完继续读,这样问题解决。

      这样解决只是治标不治本,还是有隐患的,最需要处理的就是为什么会没有读到数据。 关于文件上传这部分,只要多分析上述提到的两个函数,是最有帮助的了。

 

        在说说webs.h中定义的一些SIZE吧。WEBS_SOCKET_BUFSIZ,非常重要,此为每次从socket读取数据的长度。为了提高访问速度和上传速度,还可以增大WEBS_HEADER_BUFINC,和WEBS_BUFSIZE的大小。

        websParseRequest()函数中在提取"content-length"时,数据大小放到wp->clen里面,因此可以使用它来限制上传文件的大小。 

        终于码完了,去了一块心病。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多