goAhead上实现文件上传到嵌入式web服务器上
2013-07-31 23:57
483 查看
作者:reille
本博客网址:http://blog.csdn.net/reille/,转载本博客原创文章请注明出处。
本文内容概要:详细描述了在goAhead 2.5上如何实现文件上传(上传文件)到服务器端的功能。
开发环境:
宿 主 机:window XP;
虚 拟 机:ubuntu9.10;
交叉编译器:arm-uclibc-gcc(arm-linux-gcc-4.3.2可以顺利编译通过)
注:移植好的源代码下载地址:移植好的goAhead源码包下载地址
———————————————————————————————————————————————————————————————————
[html]
view plaincopyprint?
<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: rgb(51, 51, 255);"><!-- 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服务器接收到的上传文件数据写到存储系统。
打补丁的时候不是很方便,需要利用对比工具,把文件上传功能的源码增加到goAhead-2.5中。
[cpp]
view plaincopyprint?
/******************************************************************************/
/*
* 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 !=
'\0') {
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);
}
本博客网址:http://blog.csdn.net/reille/,转载本博客原创文章请注明出处。
本文内容概要:详细描述了在goAhead 2.5上如何实现文件上传(上传文件)到服务器端的功能。
开发环境:
宿 主 机: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 plaincopyprint?
<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: rgb(51, 51, 255);"><!-- 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>
<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> <!-- 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 --> </body> </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 plaincopyprint?
/******************************************************************************/
/*
* 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 !=
'\0') {
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上实现文件上传到嵌入式web服务器上
- goAhead上实现文件上传到嵌入式web服务器上
- goAhead上实现文件上传到嵌入式web服务器上
- java web FTPClient 实现上传文件到指定服务器
- web 项目中的文件上传服务器的代码实现
- 嵌入式 在arm平台运行ftpd服务器实现文件下载以及上传
- 服务器基于PHP CodeIgniter,Android基于Volley实现多文件/图片上传(含服务器,web版和android客户端完整代码)
- 嵌入式 在arm平台运行ftpd服务器实现文件下载以及上传以及ftp下载url小结
- 用HttpListener 建立web服务器 实现网页浏览、文件上传
- 利用HTTP协议实现Android文件上传至WEB服务器,采用PHP接收文件(参考网上自己实现)
- 实现自动上传文件到ftp服务器的BAT脚本分享
- 通过POST向WEB服务器发送数据/上传文件(HttpSendRequestEx、InternetWriteFile)
- PHP-Websockets 上传文件2 优化支持php socket客户端和websocket连接websocket服务器 以守护进程方式运行编码
- Java使用Jetty实现嵌入式Web服务器及Servlet容器
- Android端通过Okhttp与PHP服务器进行交互并实现文件上传下载(二)
- 在winform实现文件上传到服务器
- asp.net(c#)使用HttpWebRequest附加携带请求参数以post方式模拟上传大文件(以图片为例)到Web服务器端
- jsch实现sftp服务器的文件时上传下载
- C#实现Web文件上传的两种方法
- [整理]WebUploader + SpringMVC 实现多文件断点续传之一 多文件上传