goAhead上实现文件上传到嵌入式Web服务器上
本文内容概要:详细描述了在goAhead 2.5上如何实现文件上传(上传文件)到服务器端的功能。
开发环境:
        宿    主  机:Windows XP;
        虚    拟  机:Ubuntu 9.10;
        交叉编译器:arm-uclibc-gcc(arm-linux-gcc-4.3.2可以顺利编译通过)
———————————————————————————————————
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网页上增加了一个这样的form。
1. <html> 
2. <!- Copyright (c) Go Ahead Software Inc., 1999-2010. All Rights Reserved. -> 
3. <head> 
4.  
5. <!-- del by gyr 2011.10.15 
6. <title>ASP Test Page</title> 
7. --> 
8. <title> new document </title>  
9.  
10. <link rel="stylesheet" href="/style/normal_ws.css" type="text/css"> 
11. <language=javascript %> 
12.  
13. function uploadFileSubmit() 
14.
15. //  ElementById("document.softupdate")); 
16.     return; 
17.
18.  
19. </head> 
20.  
21. <body> 
22.  
23. <h1>ASP / JavaScript? Test</h1> 
24. <h2>Expanded ASP data: <% aspTest("Peter Smith", "112 Merry Way"); %></h2> 
25.  
26. <P> 
27. <% var z; \ 
28.    for (z=0; z<5zz=z+1) \ 
29.      { \ 
30.      if (z<=2) \ 
31.         write(z+" is less than 3<br>"); \ 
32.      else if (z==3) \ 
33.         write(z+" is equal to 3<br>"); \ 
34.      else \ 
35.         write(z+" is greater than 3<br>"); \ 
36.      } \ 
37. %> 
38. </P> 
39.  
40.  
41.  
42.  
43. <span style="color:#3333ff;"> 
44. <h1>GoForm upload file test</h1> 
45. <form id="softupdate" action=/goform/formUploadFileTest method=POST enctype="multipart/form-data"> 
46.     <table> 
47.         Select file: <td> <input id="fileupload" type="file" name="fileupload" size=60 value="">    </td> 
48.         <td> <input id="fileuploadsubmit" type="submit" name="update"前端大文件上传解决方案 value="update" onClick="uploadFileSubmit()">  </td> 
49.     </table> 
50. </form> 
51.  
52.  
53. </span> 
54.  
55. </body> 
56. </html> 
其中,enctype参数用来设置表单的MIME编码方式,在进行文件(或同时包含文本框)上传时,必须将其属性设置为"multipart/form-data";formUploadFileTest 是web服务器定义的一个处理函数,用于把web服务器接收到的上传文件数据写到存储系统。
2.3 goAhead增加文件上传功能
goAhead-2.5的源码中,是没有包含文件上传功能的,因此需要对goAhead-2.5增加文件上传功能。本人使用v2.1.1版本的补丁,可从下载:
免费下载地址在 linux.linuxidc/
用户名与密码都是www.linuxidc
具体下载目录在 /pub/2011/10/17/goAhead上实现文件上传到嵌入式Web服务器上/
打补丁的时候不是很方便,需要利用对比工具,把文件上传功能的源码增加到goAhead-2.5中。
2.4 把上传文件写到存储系统
在goAhead-2.5的源码main.c中增加文件上传form的处理函数:formUploadFileTest (),代码如下:
1. /******************************************************************************/ 
2. /* 
3.  * for test html upload file to web server 
4.  * add by gyr 2011.10.15 
5.  */ 
6.  
7. static void formUploadFileTest(webs_t wp, char_t *path, char_t *query) 
8.
9.     FILE *       fp; 
10.     char_t *     fn; 
11.     char_t *     bn = NULL; 
12.     int          locWrite; 
13.     int          numLeft; 
14.     int          numWrite; 
15.  
16.     printf("\n...................\n\n"); 
17.  
18.     a_assert(websValid(wp)); 
19.     websHeader(wp); 
20.  
21.     fn = websGetVar(wp, T("filename"), T("")); 
22.     if (fn != NULL && *fn != '\0') { 
23.         if ((int)(bn = gstrrchr(fn, '/') + 1) == 1) { 
24.             if ((int)(bn = gstrrchr(fn, '\\') + 1) == 1) { 
25.                 bn = fn; 
26.             } 
27.         } 
28.     } 
29.  
30.     printf("fn=%s, bn=%s  .......\n", fn, bn); 
31.  
32.     websWrite(wp, T("Filename = %s<br>Size = %d bytes<br>"), bn, wp->lenPostData); 
33.  
34.     if ((fp = fopen((bn == NULL ? "upldForm.bin" : bn), "w+b")) == NULL) { 
35.         websWrite(wp, T("File open failed!<br>")); 
36.     } else { 
37.         locWrite = 0; 
38.         numLeft = wp->lenPostData; 
39.         while (numLeft > 0) { 
40.             numWrite = fwrite(&(wp->postData[locWrite]), sizeof(*(wp->postData)), numLeft, fp); 
41.             if (numWrite < numLeft) { 
42.                 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); 
43.             break
44.             } 
45.             locWrite += numWrite; 
46.             numLeft -= numWrite; 
47.         } 
48.  
49.         if (numLeft == 0) { 
50.             if (fclose(fp) != 0) { 

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。