用C语言写的ISAPI上传文件(图片)、显示图片、图片存储以及可供其它语言调用的方式、和程序源代码
2009-12-02 11:05
846 查看
用C语言写的ISAPI上传文件(图片)、显示图片、图片存储以及可供其它语言调用的方式、和程序源代码 下载地址:http://groups.google.com/group/erp2/web/uploadfile%20%283%29.rar 下载后请解压 这个 ISAPI 程序在 windos各个平台的 IIS和Apache 上均测试验证过,客户端浏览器 firefox、IE各个版本均测试验证过! 上传时的调用方式: <iframe name="uploadfile" id="uploadfile" src=http://192.168.0.137/uploadfile/?type=0&uuid=<% =UUID %> frameborder="0" ></iframe> <img id='uploadimage' src="http://192.168.0.137/uploadfile/?type=1&uuid=<% =UUID %>" /> </div> <script type="text/javascript"> var imgurl = "<% =UUID %>"; function Refreshuploadfile() { var o = document.getElementById("uploadimage"); o.src = "http://192.168.0.137/uploadfile/?uuid=" + imgurl; } </script> 意思就是说,你可以在一个页面嵌套一个 iframe 作为图片上传的功能,上传之后程序会调用你这个页面的Refreshuploadfile 这个 js程序,以刷新进行图片显示 http://192.168.0.137/uploadfile/?type=0&uuid= 中的参数: type=1表示你需要显示 uuid所指向的图片 type=0表示你需要上传 图片并以 uuid 作为文件名进行保存! 显示图片调用方式 <img src=uploadfile?type=1&uuid=这里就用你上传时传入的UUID /> 所有图片将保存在 d;/upload/image 目录下 ,如果没有请先建立目录 在IIS中的配置如下: (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) 代码如下: #include <stdio.h> #include <stdlib.h> #include <windows.h> #include "httpext.h" #include "ipsearch.h" #include "getparam.h" #include "parsemd.h" static int isload = 0; void WriteContext(EXTENSION_CONTROL_BLOCK *pECB, char *pszFormat, ...) { char szBuffer[1024]; DWORD dwSize; va_list arg_ptr; va_start(arg_ptr, pszFormat); vsprintf(szBuffer, pszFormat, arg_ptr); va_end(arg_ptr); dwSize = strlen(szBuffer); pECB->WriteClient(pECB->ConnID, szBuffer, &dwSize, 0); } void StartContext(EXTENSION_CONTROL_BLOCK *pECB) { //WriteContext(pECB, "Content-Type:text/html; charset=gb2312;/r/n"); WriteContext(pECB, "%s", "<!DOCTYPE html PUBLIC /"-//W3C//DTD XHTML 1.0 Transitional//EN/" /"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd/">/r/n"); WriteContext(pECB, "%s", "<html>/r/n<body>/r/n"); } void EndContext(EXTENSION_CONTROL_BLOCK *pECB) { //WriteContext(pECB, "%s", "<div style=/"visibility:hidden/"><a href=/"http://www.cangzhuo.com/">藏拙</a> 作者:黄智 QQ 99923309</div>"); WriteContext(pECB, "%s", "</body>/r/n</html>/r/n"); } BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; } BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO *pVer) { pVer->dwExtensionVersion = HSE_VERSION; strncpy(pVer->lpszExtensionDesc, "uploadfile ISAPI Extension", HSE_MAX_EXT_DLL_NAME_LEN); return TRUE; } BOOL WINAPI TerminateExtension(DWORD dwFlags) { return TRUE; } void GetPage(EXTENSION_CONTROL_BLOCK *pECB, char *uuid) { WriteContext(pECB, "<FORM NAME=/"oForm/" ACTION=/"/uploadfile//" "); WriteContext(pECB, "ENCTYPE=/"multipart/form-data/" "); WriteContext(pECB, "method=/"post/"> /r/n"); WriteContext(pECB, "<INPUT TYPE=/"file/" name=/"name/"/> /r/n<INPUT TYPE=/"submit/" VALUE=/"上载文件/"><INPUT TYPE=/"text/" width=0px id=/"uuid/" name=/"uuid/" value=/"%s/" style=/"visibility:hidden/"/> /r/n </FORM>/r/n", uuid); } char *ExexuteFileName(char *filename) { int i = strlen(filename); int position = 0; char *r; r = (char *)malloc(255*sizeof(char *)); strcpy(r, filename); while (i>0) { if(filename[i]=='//') { position = i; break; } i--; } r = r + i + 1; return r; } int SaveFile(char *filename, char *buffer, int size) { FILE *fp; char *efilename = ExexuteFileName(filename); char *wfilename; int j = 0; wfilename = (char *)malloc(2550*sizeof(char)); strcpy(wfilename, "E://upload//"); strcat(wfilename, efilename); if((fp=fopen(wfilename,"wb+"))==NULL) { return 0; } for(j=0;j<size;j++) fputc(buffer[j], fp); fclose(fp); return 1; } int SaveFileNew(char *puuid, char *buffer, int size) //int SaveFileNew(EXTENSION_CONTROL_BLOCK *pECB, uploaddata *FormData) { FILE *fp; char *wfilename; int j = 0; wfilename = (char *)malloc(2550*sizeof(char)); strcpy(wfilename, "d://upload//image//"); strncat(wfilename, puuid, 3); mkdir(wfilename); strcat(wfilename, "//"); strncat(wfilename, puuid, 32); strcat(wfilename, ".dat"); if((fp=fopen(wfilename,"wb+"))==NULL) { return 0; } for(j=0;j<size;j++) fputc(buffer[j], fp); fclose(fp); return 1; } void LoadImageFile(EXTENSION_CONTROL_BLOCK *pECB, char *puuid) { HSE_SEND_HEADER_EX_INFO SendHeaderExInfo; DWORD cchStatus; DWORD cchHeader; DWORD cchContent; DWORD size = 0; char szStatus[] = "200 OK"; char *szContent = {0}; char szHeaderBase[] = "Content-Length: %lu/r/nContent-type: image/jpeg/r/n/r/n"; //char szHeaderBase[] = "Content-Length: %lu/r/nContent-type: text/html/r/n/r/n"; char szHeader[4096]; FILE *fp; char *wfilename; int j = 0; char buffer[1024] = {0}; char ch; char header[200] = {0}; int dwWritten; wfilename = (char *)malloc(255*sizeof(char)); strcpy(wfilename, "d://upload//image//"); strncat(wfilename, puuid, 3); mkdir(wfilename); strcat(wfilename, "//"); strncat(wfilename, puuid, 32); strcat(wfilename, ".dat"); strcat(wfilename, "/0"); if((fp=fopen(wfilename,"rb"))==NULL) { return; } else { size = 0; //ch = fgetc(fp); ch = 0; while(!feof(fp)) { ch = fgetc(fp); size++; } } fseek(fp, 0, SEEK_SET); szContent = (char *)malloc(sizeof(char)*size); size = 0; while(!feof(fp)) { ch = fgetc(fp); szContent[size] = ch; size++; } // fclose(fp); fflush(fp); cchStatus = lstrlen(szStatus); cchHeader = lstrlen(szHeader); cchContent = size; sprintf( szHeader, szHeaderBase, cchContent ); SendHeaderExInfo.pszStatus = szStatus; SendHeaderExInfo.pszHeader = szHeader; SendHeaderExInfo.cchStatus = cchStatus; SendHeaderExInfo.cchHeader = cchHeader; SendHeaderExInfo.fKeepConn = FALSE; if ( 0 == lstrcmpi( pECB->lpszQueryString , "Keep-Alive" ) ) { SendHeaderExInfo.fKeepConn = TRUE; } if ( !pECB->ServerSupportFunction( pECB->ConnID , HSE_REQ_SEND_RESPONSE_HEADER_EX , &SendHeaderExInfo , NULL , NULL ) ) { return HSE_STATUS_ERROR; } pECB->WriteClient(pECB->ConnID, szContent, &size, 0); free(szContent); free(wfilename); } DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB) { FILE *fp; int argc; param *myparams; char *content; char *msgBody; int i = 0, j=0; int arrsize = 0; uploaddata FormData[FORM_DATA_ARRAY_SIZE]; int status = 0; int nWrite; BOOL bResult = TRUE; int nRead = 1024; int TotalBytes = 0, Available=0, nUnSend=0, nTotalRead=0, nTotalWrite=0; char* pBuf; int cbQuery = 1024; LPSTR lpszTemp = NULL; char buffer[1024] = {0}; char *fuuid = {0}; char *fcontent = {0}; int size = 0; char *ftype = {0}; char *ptype = {0}; if (strcmp(pECB->lpszMethod, "GET")==0) { status=CGIToArgv(pECB->lpszQueryString, &argc, &myparams); //参数解析 if(status) { if(parambyname("type", &argc, &myparams)!=NULL) { ptype = parambyname("type", &argc, &myparams); fuuid = parambyname("uuid", &argc, &myparams); if(strcmp(ptype, "1")==0) { fuuid = parambyname("uuid", &argc, &myparams); LoadImageFile(pECB, fuuid); return HSE_STATUS_SUCCESS; //TerminateExtension(1); } else { StartContext(pECB); GetPage(pECB, fuuid); EndContext(pECB); return HSE_STATUS_SUCCESS; } } } else { StartContext(pECB); GetPage(pECB, ""); EndContext(pECB); return HSE_STATUS_SUCCESS; } return HSE_STATUS_ERROR; } if (strcmp(pECB->lpszMethod, "POST")==0) { //status=CGIToArgv(pECB->lpbData, &argc, &myparams); //参数解析 //if(status) //{ //if(parambyname("uuid", &argc, &myparams)!=NULL) //{ //uuid = parambyname("uuid", &argc, &myparams); StartContext(pECB); TotalBytes = (int)pECB->cbTotalBytes; Available = (int)pECB->cbAvailable; nUnSend = TotalBytes - Available; msgBody = pECB->lpbData; content = (char *)malloc(TotalBytes*sizeof(char)); for(i=0;i<pECB->cbAvailable;i++) content[i] = msgBody[i]; if(nUnSend==0) { arrsize = GetFormData(content, pECB->cbAvailable, strstr(pECB->lpszContentType, "boundary=")+strlen("boundary="), &FormData); } else { while( bResult ) { nRead = 1024; bResult = pECB->ReadClient(pECB->ConnID, buffer, &nRead); for(i=0;i<nRead;i++) { content[Available+i] = buffer[i]; } Available += nRead; if( Available>=pECB->cbTotalBytes ) break; } arrsize = GetFormData(content, pECB->cbTotalBytes, strstr(pECB->lpszContentType, "boundary=")+strlen("boundary="), &FormData); } if(arrsize>1) { fuuid = FormData[picparambyname("uuid", &FormData, arrsize)].content; fcontent = FormData[picparambyname("name", &FormData, arrsize)].content; size = FormData[picparambyname("name", &FormData, arrsize)].size; ftype = FormData[picparambyname("name", &FormData, arrsize)].contenttype; if(strstr(ftype, "image")==NULL) { WriteContext(pECB, "%s", "上传的不是图片文件!"); EndContext(pECB); free(content); return HSE_STATUS_ERROR; } else { SaveFileNew(fuuid, fcontent, size); GetPage(pECB, fuuid); WriteContext(pECB, "<script>parent.Refreshuploadfile();</script>"); //WriteContext(pECB, "<br>文件【%s】上传成功,大小是: %d byte", fuuid, size); //WriteContext(pECB, "<img src=/uploadfile/?uuid=%s />", fuuid); //EndContext(pECB); free(content); return HSE_STATUS_SUCCESS; } } WriteContext(pECB, "%s", "文件上传失败!"); free(content); EndContext(pECB); } //else //{ // WriteContext(pECB, "%s", "文件上传失败!"); //} //} //else //{ // WriteContext(pECB, "%s", "文件上传失败!"); //} return HSE_STATUS_ERROR; } |
相关文章推荐
- apk反编译生成程序的源代码和图片、XML配置、语言资源等文件
- Android apk反编译图解(得到程序的java源代码,图片、XML配置、语言资源等文件)
- c++调用其它程序的方法,以及读取本地txt文件方法。
- apk反编译生成程序的源代码和图片、XML配置、语言资源等文件
- strusts2文件上传下载,以及二进制图片显示问题
- WPF用流的方式上传/显示/下载图片文件(保存在数据库)
- net3:文件上传与图片显示以及HiddenField隐藏字段值的使用
- SpringMVC多个文件上传以及上传后立即显示图片
- spring mvc的图片上传以及删除功能【封装可用】,另附加在controller中调用的方式
- 在数据库中 存储图片 以及 在界面中显示图片(存储图片路径)- 这种方法相对与存储二进制文件好
- c#程序中调用Oracle存储过程上传二进制文件
- (爱加密系列教程十)apk反编译生成程序的源代码和图片、XML配置、语言资源等文件
- LINUX目录和文件各自的权限说明,以及目录和文件权限之间的关系(应用:配置linux下上传图片的存储目录)
- input标签type="file"的格式要求,以及文件阅读,图片上传前的显示
- apk反编译生成程序的源代码和图片、XML配置、语言资源等文件
- 反编译apk生成程序的java源代码和图片、XML配置、语言资源等文件
- 小程序的图片上传wx.uploadFile及后台PHP接收文件并存储到服务器
- Android apk反编译图解(得到程序的java源代码,图片、XML配置、语言资源等文件)
- 反编译apk生成程序的源代码和图片、XML配置、语言资源等文件
- (安全系列二)apk反编译生成程序的源代码和图片、XML配置、语言资源等文件