【问题标题】:Upload image to php webservice and store it in MSSQL database将图像上传到 php webservice 并将其存储在 MSSQL 数据库中
【发布时间】:2016-05-06 23:00:35
【问题描述】:

我正在尝试将图像上传到 php Web 服务并将其存储在 MS SQL 数据库中。我的帖子数据是 json 格式,其中包含 base64 编码的图像数据。

Base 64 编码和插入样本

$base=base64_encode(file_get_contents("C:\sample\images.jpg"));
$CommandText = "INSERT INTO [M_IMAGES] ([IMAGE_DATA]) VALUES(?) " ;
                 $ImageStream = imagecreatefromstring(base64_decode($this->imageData));
            $RowsAffected = (int)$objDBManager->Exe*emphasized text*cuteNonQuery($CommandText,array(array($ImageStream, 
                         SQLSRV_PARAM_IN,
                         SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY),
                         SQLSRV_SQLTYPE_VARBINARY('max'))));

这里 $this->imageData 包含 base64 编码的图像数据,IMAGE_DATA 数据类型是图像。我能够在正常上传中成功上传和检索图像

正常上传

$ImagePath = $_FILES[$ImageCtrlName]['tmp_name'];
    $ImageStream = fopen($ImagePath, "r");
    $RowsAffected = (int)$objDBManager->ExecuteNonQuery($CommandText,
                        array(array(&$ImageStream,
                                 SQLSRV_PARAM_IN,
                                 SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY),
                                 SQLSRV_SQLTYPE_VARBINARY('max'))));
    fclose($ImageStream);

我收到错误sqlsrv_query():提供的资源不是有效的流资源 谁能指出这里有什么问题。或者有没有更好的方法来做到这一点。帮助我,因为我是 PHP 新手。

【问题讨论】:

  • 我不建议将图像存储在数据库中,因为 base64 会变得非常大。
  • @LFlare 我会接受你的建议。但是现有的生产代码以这种方式存储图像,我不想改变它。
  • 迁移所有 base64 图像,将它们转换回原始形式并将它们存储为文件,而不是表中的列,这可能符合您的最佳利益。当涉及到 2-5MB 的大图像时,您将真正意识到不建议将图像存储在数据库中,无论是在性能上还是在逻辑上。 但是,如果您仍打算这样做,我希望它存储在 text/longtext 类型列中
  • @LFlare 最大图像大小为 1 MB,并以图像形式存储
  • 我不太确定,I am trying to upload image to php web service and store it in MS SQL database. 告诉我您正在将图像存储到数据库中? 编辑:我意识到你的问题,请看我的回答。

标签: php sql-server web-services image-uploading sqlsrv


【解决方案1】:

最好的解决方案是只在数据库中保存图像的 url,然后将图像保存在您的服务器中。 当你想打印它时,你只需要在数据库中搜索 url。 尝试将图像保存在数据库中是错误的解决方案。

【讨论】:

    【解决方案2】:

    根据我从您的问题中了解到的情况,您的问题源于尝试将图像存储到 MSSQL 中,因为它是二进制形式,这是不允许。我能做的是建议您将图像存储为 base64 形式,这是一串字母数字字符。无需尝试将图像存储为 base64 编码图像,通常可以直接提供给客户端。

    TL;DR 只需将图像存储为 base64。

    【讨论】:

    • 图像是base64_encoded所以在写入数据库时​​解码
    • @Gops 不要对其进行解码并写入数据库,数据库不会接受二进制文件。 TRY 将其写入 base64_encoded 的数据库。如果您不清楚,您不能将图像文件直接写入数据库
    • imagecreatefromstring() 如果我们不解码图像会抛出错误
    猜你喜欢
    • 2016-10-12
    • 1970-01-01
    • 2019-10-18
    • 2015-02-19
    • 2015-11-30
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    相关资源
    最近更新 更多