摘要:goAhead 2.5嵌入式web服务器移植到arm9 2440 + linux中一文中介绍了goAhead移植到嵌入式linux系统的方法与步骤,并实现了通过用户浏览器浏览goAhead源码带的demo网页。

goAhead是一款优秀、性能稳定的嵌入式web服务器,但在官方发布的源码中却没有提供文件上传功能。如果想实现文件上传功能或与此相关的功能(如通过web进行软件升级),则将遇到不少疑惑和困难,甚至一筹莫展(reille的经历就是如此)。

不过不用着急,reille早已解决此问题。如果你使用goAhead作为嵌入式web服务器,并且想通过web页面实现文件上传功能和软件升级功能,在这里,都可以找到你想要的答案。

1. 说明

最近调试web文件上传到服务器功能,但在调试时,处理函数总是获取不到文件路径,百思不得其解,查了网上许多文章,但大多提到的是前端文件上传的原理、实现方式等,而未提供服务器端处理的实现(利用C函数实现)。此外,由于对web不了解,花了些时间研究web程序。

2. goAhead实现文件上传的方法

总得来说,goAhead上实现文件上传功能是比较容易的。因为有现成的代码可用,稍微移植下即可。

2.1 实现原理

使用html form即表单提交文件上传请求,web服务器核心处理接收客户端Post过来的文件数据(注意post的是二进制数据),最后,web服务器把接收到文件数据以二进制格式写到服务器本端存储系统。

2.2 前端设计

前端设计比较简单,就是设计一个form,type属性为file,本人是在goAhead-2.5附带的wwwdemo的asptest.asp网页(对应JavaScript菜单)上增加了一个这样的form。

<html>
<!- Copyright (c) Go Ahead Software Inc., 1999-2010. All Rights Reserved. ->
<head>

<!-- del by gyr 2011.10.15
<title>ASP Test Page</title>
-->
<title> new document </title> <!-- add by gyr 2011.10.15 -->

<link rel="stylesheet" href="/style/normal_ws.css" type="text/css">
<% language=javascript %>

function uploadFileSubmit()
{
//	alert(document.getElementById("document.softupdate"));
	return;
}

</head>

<body>

<h1>ASP / JavaScript™ Test</h1>
<h2>Expanded ASP data: <% aspTest("Peter Smith", "112 Merry Way"); %></h2>

<P>
<% var z; \
   for (z=0; z<5; z=z+1) \
     { \
     if (z<=2) \
		write(z+" is less than 3<br>"); \
     else if (z==3) \
		write(z+" is equal to 3<br>"); \
     else \
		write(z+" is greater than 3<br>"); \
     } \
%>
</P>




<span style="color:#3333ff;"><!-- added start for test upload file by gyr 2011.10.15 -->
<h1>GoForm upload file test</h1>
<form id="softupdate" action=/goform/formUploadFileTest method=POST enctype="multipart/form-data">
	<table>
		Select file: <td> <input id="fileupload" type="file" name="fileupload" size=60 value=""> 	</td>
		<td> <input id="fileuploadsubmit" type="submit" name="update" value="update" onClick="uploadFileSubmit()">	</td>
	</table>
</form>
<!-- added end for test upload file by gyr 2011.10.15 -->

</span>

</body>
</html>

其中,enctype参数用来设置表单的MIME编码方式,在进行文件(或同时包含文本框)上传时,必须将其属性设置为"multipart/form-data";formUploadFileTest 是web服务器定义的一个处理函数,用于把web服务器接收到的上传文件数据写到存储系统。

实际效果如下图所示:

image 

2.3 goAhead增加文件上传功能

goAhead-2.5的源码中,是没有包含文件上传功能的,因此需要对goAhead-2.5增加文件上传功能。本人使用v2.1.1版本的补丁,下载地址:http://velep.com/archives/321goAhead官方源码包和文件上传补丁

打补丁的时候不是很方便,需要利用对比工具,把文件上传功能的源码增加到goAhead-2.5中。

2.4 把上传文件写到存储系统

在goAhead-2.5的源码main.c中增加文件上传form的处理函数:formUploadFileTest (),代码如下:

/******************************************************************************/
/*
 * for test html upload file to web server
 * add by gyr 2011.10.15
 */

static void formUploadFileTest(webs_t wp, char_t *path, char_t *query)
{
    FILE *       fp;
    char_t *     fn;
    char_t *     bn = NULL;
    int          locWrite;
    int          numLeft;
    int          numWrite;

	printf("\n...................formUploadFileTest...................\n\n");

    a_assert(websValid(wp));
    websHeader(wp);

    fn = websGetVar(wp, T("filename"), T(""));
    if (fn != NULL && *fn != '') {
        if ((int)(bn = gstrrchr(fn, '/') + 1) == 1) {
            if ((int)(bn = gstrrchr(fn, '\\') + 1) == 1) {
                bn = fn;
            }
        }
    }

	printf("fn=%s, bn=%s  .......\n", fn, bn);

    websWrite(wp, T("Filename = %s<br>Size = %d bytes<br>"), bn, wp->lenPostData);

    if ((fp = fopen((bn == NULL ? "upldForm.bin" : bn), "w+b")) == NULL) {
        websWrite(wp, T("File open failed!<br>"));
    } else {
        locWrite = 0;
        numLeft = wp->lenPostData;
        while (numLeft > 0) {
            numWrite = fwrite(&(wp->postData[locWrite]), sizeof(*(wp->postData)), numLeft, fp);
            if (numWrite < numLeft) {
                websWrite(wp, T("File write failed.<br>  ferror=%d locWrite=%d numLeft=%d numWrite=%d Size=%d bytes<br>"), ferror(fp), locWrite, numLeft, numWrite, wp->lenPostData);
            break;
            }
            locWrite += numWrite;
            numLeft -= numWrite;
        }

        if (numLeft == 0) {
            if (fclose(fp) != 0) {
                websWrite(wp, T("File close failed.<br>  errno=%d locWrite=%d numLeft=%d numWrite=%d Size=%d bytes<br>"), errno, locWrite, numLeft, numWrite, wp->lenPostData);
            } else {
                websWrite(wp, T("File Size Written = %d bytes<br>"), wp->lenPostData);
            }
        } else {
            websWrite(wp, T("numLeft=%d locWrite=%d Size=%d bytes<br>"), numLeft, locWrite, wp->lenPostData);
        }
    }

    websFooter(wp);
    websDone(wp, 200);

}

重新编译程序,运行(注意:运行goAhead带的wwwdemo网页,要加上参数-demo)。在imageWebServer Tests菜单下的JavaScript页面中可看到上图中的form。

reille blog提供了移植好的并具有文件上传功能的源代码供大家分享,下载地址:http://velep.com/archives/139

关于goAhead文件上传功能就是这些,如果实际中遇到什么问题可以留言给我,reille(工作中用的就是这款嵌入式web服务器)会毫无保留的告诉你。

» 文章出处: reille博客—http://velep.com , 如果没有特别声明,文章均为reille博客原创作品
» 郑重声明: 原创作品未经允许不得转载,如需转载请联系reille#qq.com(#换成@)
分享到:

  3 Responses to “goAhead上实现文件上传到嵌入式web服务器上”

  1. 上传大点的文件不可以呢?大小20多M

 Leave a Reply

(必须)

(我会替您保密的)(必须)

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.

   
© 2012 velep.com | reille blog | 管理| 粤ICP备12094833号-2| 谷歌地图| 百度地图| Suffusion theme|Sayontan Sinha

无觅相关文章插件,快速提升流量