goAhead上实现文件上传到嵌入式web服务器上

1 篇文章 0 订阅

本文内容概要:详细描述了在goAhead 2.5上如何实现文件上传(上传文件)到服务器端的功能。

转载网址:http://blog.csdn.net/reille/article/details/6876980

开发环境:

        宿    主   机:window XP;

        虚    拟   机:ubuntu9.10;

        交叉编译器:arm-uclibc-gcc(arm-Linux-gcc-4.3.2可以顺利编译通过)

注:移植好的源代码下载地址:移植好的goAhead源码包下载地址

———————————————————————————————————————————————————————————————————

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。

[html]  view plain  copy
  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> <!-- add by gyr 2011.10.15 -->  
  9.   
  10. <link rel="stylesheet" href="/style/normal_ws.css" type="text/css">  
  11. <language=javascript %>  
  12.   
  13. function uploadFileSubmit()  
  14. {  
  15. //  alert(document.getElementById("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<5z=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;"><!-- added start for test upload file by gyr 2011.10.15 -->  
  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. <!-- added end for test upload file by gyr 2011.10.15 -->  
  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版本的补丁,可从下载:http://velep.com/archives/321.html

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

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

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

[cpp]  view plain  copy
  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...................formUploadFileTest...................\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) {  
  51.                 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);  
  52.             } else {  
  53.                 websWrite(wp, T("File Size Written = %d bytes<br>"), wp->lenPostData);  
  54.             }  
  55.         } else {  
  56.             websWrite(wp, T("numLeft=%d locWrite=%d Size=%d bytes<br>"), numLeft, locWrite, wp->lenPostData);  
  57.         }  
  58.     }  
  59.   
  60.     websFooter(wp);  
  61.     websDone(wp, 200);  
  62.   
  63. }  

3. 资料

3.1 http://blog.csdn.net/reille/article/details/6871827 本博客转载的文章

3.2 http://www.hackchina.com/r/57970/v2.1.1-_-web-_-upload.htm__html   前端实现参考

3.3 http://www.hackchina.com/r/57970/v2.1.1-_-LINUX-_-upldForm.c__html 服务器端实现参考

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值