braintag

公開してしまう備忘録

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