使用存储过程将文件 URL 转换为文件字节?

Posted

技术标签:

【中文标题】使用存储过程将文件 URL 转换为文件字节?【英文标题】:Convert a file URL to file byte in using a stored procedure? 【发布时间】:2021-10-26 21:05:21 【问题描述】:

我的数据库有一张 person 表,在该表上有一个名为 PersonImageUrl 的列(托管在 azure 的公共容器中)。我即将迁移到新数据库。新数据库表中的新列需要VARBINARY(max)。我想创建一个存储过程,将PersonImageUrl(URL 指向的文件)的内容转换为字节数组,以满足我的迁移要求。这可能吗?

【问题讨论】:

该字节数组的预期内容是什么? URL 指向的文件的 URL 或字节? 您可以尝试类似***.com/questions/4798538/… 的方法来获取图像,并将结果作为字节数组传递给您的存储过程。 @DaleK 我已经尝试过大量研究,但不幸的是我没有找到任何答案。 好像你有图片的网址。所以你需要下载图像,转换为字节数组并保存到新的数据库。这不能用存储过程来完成。 为什么新表also 不直接指向URL?将字节存储在数据库中很麻烦,原因有很多,最重要的是:SQL Server 磁盘空间比专门为存储而设计的基本文件系统方式更昂贵(并且通常对吞吐量敏感)并提供文件。 【参考方案1】:

Azure SQL 数据库(和 SQL Server 2017+)具有与 Azure BLOB 存储的内置集成,对于公共容器,您甚至不需要凭据, 例如:

CREATE EXTERNAL DATA SOURCE BlobStore
WITH 
(
   TYPE = BLOB_STORAGE,
   LOCATION = 'https://MyStorageAccount.blob.core.windows.net'
);


SELECT BulkColumn Image 
FROM OPENROWSET
(
   BULK 'MyPublicContainer/someimage.jpg',
   DATA_SOURCE = 'BlobStore',
   SINGLE_BLOB
) AS blob;   

Examples of bulk access to data in Azure Blob storage

【讨论】:

嗨@David Browne,我的朋友对此有一个相关的问题。在这里发布***.com/questions/69743468/… 嗨@David Browne,您是否尝试过将其与天蓝色容器中文件夹内的文件一起使用?不能打开。操作系统错误代码32(该进程无法访问该文件,因为它正在被另一个进程使用 Blob 容器没有文件夹。使用“/”来模拟文件夹结构只是一种约定。 嗨@David Browne,我认为我的主要问题是,当我通过浏览器打开 URL 时它可以工作,但在存储过程中它会抛出此错误,无法打开。操作系统错误代码32(该进程无法访问该文件,因为它正在被另一个进程使用

以上是关于使用存储过程将文件 URL 转换为文件字节?的主要内容,如果未能解决你的问题,请参考以下文章

安全反序列化漏洞

如何将声音字节转换为可以在变量中访问的 .wav 文件?

将 Html 5 img src 数据字符串转换为原始字节或文件

如何将字节数组转换为图像文件?

将字节数组转换为 wav 文件

文件IO序列化及反序列化