1 回答

TA贡献1820条经验 获得超10个赞
我花了至少10天的时间在网上广泛搜索并测试了各种解决方案才解决这个问题。
上述问题的答案是不可能将二进制字符串直接保存到 SQL Server 数据库中。该文件需要作为字符串发送hex。
解决方案:
public function asBinary($content): ?string
{
$fileName = $this->create($content);
$fileAsBinary = file_get_contents(Yii::$app->cache->cachePath . '/' . $fileName);
return $fileAsBinary;
}
/**
* zips file in cache folder into archive
*/
public function create($content): ?string
{
$zipName = \microtime();
try {
$zip = new \ZipArchive;
if ($zip->open(Yii::$app->cache->cachePath . '/' . $zipName, \ZipArchive::CREATE) === true) {
$zip->addFromString(time().'.RTF', $content);
$zip->close();
} else {
throw new Exception(Yii::t('app', 'Archive could not be created in cache folder.'));
}
} catch (\Throwable $th) {
throw $th;
}
return $zipName ?? null;
}
//return file as Hex string
public function asHex($content): string
{
$fileAsBinary = $this->asBinary($content);
$unpackedBinaryFile = unpack('H*hex', $fileAsBinary);
$fileAsHex = '0x' . $unpackedBinaryFile['hex'];
return $fileAsHex;
}
填充 $model 中的 ZIPFILE
$model->ZIPFILE = (new Zip)->asHex($model->ZIPFILE);
zip 文件需要转换为hex可以直接保存到 SQL Server 中的字符串。VARBINARYSQL Server在插入数据库时会将其转换为。
由于不清楚的原因,我无法使用 Yii2 的准备好的语句传递 ZIPFILE。每次都会出错。另外,无法使用 ActiveRecord 的$model->save()方法进行保存。必须使用 SQL 查询字符串插入。如果有人能说出原因,那就太好了。
- 1 回答
- 0 关注
- 88 浏览
添加回答
举报