用C语言写的ISAPI上传文件(图片)、显示图片、图片存储以及可供其它语言调用的方式、和程序源代码

来源:互联网 发布:采购流程的优化方法 编辑:程序博客网 时间:2024/04/28 21:33

用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;
}