ASPにてCOMにてJPEGをアップロード
マルチパートでポストするhtml。
<FORM NAME="PostData" METHOD="POST" ENCTYPE="multipart/form-data" ACTION="./jpgpost.asp"> <INPUT TYPE="file" NAME="Picture"> <INPUT TYPE="submit" NAME="Enter" VALUE="submit">
サーバ側のASPで受け取ったらCOMに渡す。
<% total_size = Request.TotalBytes bin_read = Request.BinaryRead(total_size) Set test = CreateObject("image.Interface") recarray= test.JpegContentsImageSet(bin_read) Set test = Nothing %>
COM側では結構ややこしい処理する。
面倒なのでコードは省く。
バリアント型をchar[]に変換して、そのデータからMIME情報を削除し、バイナリデータだけを抜き取る。
これでオーケー。
バリアント型をcharへ変換するコードは以下に
/** * バリアント型のバイナリデータ配列をchar *へ */ const int MAX_SIZE = 1024 * 1024; //1M byte を超えるデータは処理しない int CCommon::variant2bin(VARIANT& vstr,char **ptr) { CCommon::LogOutPut(LOGLEVEL::INFO,0,"read_array start"); *ptr = NULL; VARIANT args = vstr; VARTYPE vt = V_VT(&args); // check VARIANT REFERENCE if (vt == (VT_VARIANT | VT_BYREF)) { args = *args.pvarVal; vt = V_VT(&args); } int bArray = vt & VT_ARRAY; if (!bArray){ // not array CCommon::LogOutPut(LOGLEVEL::ERR,0,"read_array not array"); return 0; } SAFEARRAY *psa = NULL; HRESULT hr; LONG cElements, lLBound, lUBound; char *pdata; psa = V_ARRAY(&args); // Check dimensions of the array. if (SafeArrayGetDim(psa) != 1){ CCommon::LogOutPut(LOGLEVEL::ERR,0,"read_array Check dimensions of the array."); return 0; } // Get array bounds. hr = SafeArrayGetLBound(psa, 1, &lLBound); if (FAILED(hr)){ CCommon::LogOutPut(LOGLEVEL::ERR,0,"read_array SafeArrayGetLBound error"); return 0; } hr = SafeArrayGetUBound(psa, 1, &lUBound); if (FAILED(hr)){ CCommon::LogOutPut(LOGLEVEL::ERR,0,"read_array SafeArrayGetLBound error"); return 0; } // Get a pointer to the elements of the array. hr = SafeArrayAccessData(psa, (LPVOID*)&pdata); if (FAILED(hr)){ CCommon::LogOutPut(LOGLEVEL::ERR,0,"read_array SafeArrayAccessData error"); return 0; } // element count. cElements = lUBound-lLBound+1; if(MAX_SIZE < cElements){ CCommon::LogOutPut(LOGLEVEL::ERR,0,"read_array file size error over %d",MAX_SIZE); return 0; } // put array data *ptr = pdata; hr = SafeArrayUnaccessData(psa); CCommon::LogOutPut(LOGLEVEL::INFO,0,"read_array end"); return cElements; }