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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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><!-- 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<5; z z=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 encty
pe="multipart/form-data">
46.<table>
47. Select file: <td><input id="fileupload"type="file"name="fileupload"siz
e=60value=""></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版本的补丁,可从下载:
免费下载地址在/
用户名与密码都是
具体下载目录在 /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...................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->lenP
ostData);
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 nu
mLeft=%d numWrite=%d Size=%d bytes<br>"), ferror(fp), locWrite, numLeft, n umWrite, 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 nu
mLeft=%d numWrite=%d Size=%d bytes<br>"), errno, locWrite, numLeft, num Write, wp->lenPostData);
52. } else {
53. websWrite(wp, T("File Size Written = %d bytes<br>"), wp->lenPostD
ata);
54. }
55. } else {
56. websWrite(wp, T("numLeft=%d locWrite=%d Size=%d bytes<br>"), nu
mLeft, locWrite, wp->lenPostData);
57. }
58. }
59.
60. websFooter(wp);
61. websDone(wp, 200);
62.
63.}。

相关文档
最新文档