我试图使用jdbc驱动程序从postgres数据库中检索blob.内存太大,所以我想将其作为下载流式传输.我尝试在ResultSet上使用getBinaryStream方法,但事实证明这个方法实际上将它全部读入内存,因此不适用于大文件.
显然,可以在结果集上使用getBlob方法,并且可以从blob中获取输入流并从那里开始,但这就是我遇到问题的地方.
PreparedStatement ps = con.prepareStatement("select data from file_data WHERE ID = ?");
ps.setLong(1,file.fileData.id)
ResultSet rs = ps.executeQuery()
if(rs.next()){
rs.getBlob("data")
Run Code Online (Sandbox Code Playgroud)
那是我正在运行的代码.当它到达最后一行时,它会抛出一个我无法理解的错误......
org.postgresql.util.PSQLException:long类型的错误值:xxxxxx
"xxxxxx"然后是文件的内容.你可以想象这会很长,但不是真的.
我被困在这里 有没有人对正在发生的事情有任何想法?哎呀我甚至会采用其他方法来流式传输大blob作为下载.
我正在运行的版本(基本上是最新的):
PHP:5.3.1
MySQL:5.1.41
Apache:2.2.14
OS:CentOS(最新)
情况就是这样.
我有数千个非常重要的文件,从客户合同到语音签名(合同的客户授权记录),文件类型包括但不限于jpg,gif,png,tiff,doc,docx,xls,wav,mp3 ,pdf等
所有这些文档目前都存储在多个服务器上,包括Windows 32位,CentOS和Mac等.有些文件也存储在员工台式计算机和笔记本电脑上,有些文件仍然是存储在数百个盒子和文件柜中的硬拷贝.
现在因为客户或律师可以随时要求合同证明,我公司必须能够有效地搜索和找到正确的文件,因此所有这些文件都必须数字化(如果还没有)并且相关进入某种搜索和访问的顺序.
作为程序员,我创建了一个完整的客户关系管理工具,供整个公司使用.这包括客户资料管理,订单和工作跟踪工具,工作/销售创建和管理模块等,以及目前客户资料级别(驾驶执照,信用授权等)或工作中所需的任何文件/销售级别(合同,语音签名等)可以上传到服务器并位于父/子层次结构中,就像Windows资源管理器或任何其他典型的文件管理模型一样.
结构如下:
drivers_license
| - DL_123.jpg
voice_signatures
| - VS_123.wav
| - VS_4567.wav
合同
因此,文件使用PHP和Apache进行上传,并存储在操作系统的文件系统中.在上载时,关于文件的某些信息存储在MySQL数据库中.存储的一些信息是:
表:FileUploads
FileID
CustomerID(文件所属的客户ID,它们都有此.)
JobID/SaleID(相关作业/销售的ID,如果有)
.FileSize
FileType
UploadedDateTime
UploadedBy
FilePath(文件的目录路径是存储在.)
FileName(上传文件的当前文件名,CustomerID和JobID/SaleID的组合,如果适用.)
FileDescription
OriginalFileName(上载时源文件的原始名称,包括扩展名.)
如您所见,文件通过文件名链接到数据库.当我想提供客户的文件下载给用户时,我所要做的就是"SELECT*FROM FileUploads WHERE CustomerID = 123 OR JobID = 2345;" 这将输出我需要的所有文件详细信息,并且使用FilePath和FileName,我可以提供下载链接.
http ... server/FilePath/FileName
这种方法存在许多问题:
有很多原因,其中一些在这里描述:http://www.dreamwerx.net/site/article01.此外,这里也有一篇有趣的文章:sietch.net/ViewNewsItem.aspx?NewsItemID=124.
因此,经过大量研究后,我几乎已经决定将所有这些文件存储在数据库中,如BLOB或LONGBLOB,但在我这样做之前还有很多注意事项.
我知道将它们存储在数据库中是一个可行的选择,但是有许多方法可以存储它们.我也知道存放它们是一回事; 以可管理的方式关联和访问它们完全是另一回事.
此链接提供的文章:dreamwerx.net/site/article01描述了一种将上传的二进制文件拆分为64kb块并使用FileID存储每个块,然后使用标头将实际二进制文件流式传输到客户端的方法.这是一个非常酷的主意,因为它减轻了对服务器内存的预感; 而不是将整个100mb文件加载到RAM然后将其发送到客户端,它一次只做64kb.我已经尝试了这个(并更新了他的脚本),这在一个非常小的测试框架中是完全成功的.
因此,如果您同意这种方法是一个可行的,稳定的和强大的长期选项来存储适度大的文件(1kb到几百megs),以及大量的这些文件,请告诉我您有哪些其他注意事项或想法.
此外,我正在考虑获取当前的"文件管理"PHP脚本,该脚本提供了一个界面,用于管理存储在文件系统中的文件,并将其转换为管理存储在数据库中的文件.如果已经有任何软件可以做到这一点,请告诉我.
我想我可以提出很多问题,并且所有信息都在那里^^所以请讨论这方面的所有方面,我们可以来回传递想法并相互教授.
干杯,
Quantico773
我从互联网下载数据库.我将它保存在我的datases文件夹中,然后打开它.在数据库内部有一个包含6个字段的"广告"表.其中2个字段是BLOB.当我想从这个表中读取...我有一些问题...我注意到当我读取一个blob字段大于1兆字节的行时,这会导致异常..."从行获取字段槽0 col 0失败".如果它有点blob,一切都还可以......在此先感谢:)
W/CursorWindow(15677):窗口已满:请求分配2195889字节,可用空间2096720字节,窗口大小2097152字节
我知道有app内存可用:
D/dalvikvm(15677):GC_FOR_ALLOC释放9K,30%免费17050K/24291K,暂停45ms
因此,它纯粹是做光标大小的窗口,阅读时blob进入byte[].
我使用内置方法从游标中读取blob.
try
{
c = rdb.query("Photos", new String[]{"photo"}, "id = ?", new String[]{""+photoID}, null, null, null);
if(c.moveToFirst())
{
byte[] tArray = c.getBlob(c.getColumnIndex("photo")); // THIS LINE ERRORS
}
}catch(Exception e)
{
e.printStackTrace();
}
c.close();
return tArray;
Run Code Online (Sandbox Code Playgroud)
有没有解决的办法?窗口大小似乎限制为2097152字节.
我有一个文件输入: (jsbin)
<input type="file" accept="image/*" id="input" multiple onchange='handleFiles(this)' />
Run Code Online (Sandbox Code Playgroud)
选择文件时,显示所选图像的小图像:
我可以用两种方式做到:
使用FileReader:
function handleFiles(t) //t=this
{
var fileList = t.files;
for (var i = 0; i < fileList.length; i++)
{
var file = fileList[i];
var img = document.createElement("img");
img.style... = ...
document.getElementById('body').appendChild(img);
var reader = new FileReader();
reader.onload = (function (aImg)
{
return function (e)
{
aImg.src = e.target.result;
};
})(img);
reader.readAsDataURL(file);
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
使用ObjectURL/BLOB:
function handleFiles(t)
{
var fileList = t.files;
for (var …Run Code Online (Sandbox Code Playgroud) 当你保存你的图像时(你有很多这样的图像)你会在数据库中存储为blob,还是作为文件存储?为什么?
我在mySQL中有一个表,它有一个名为"image"的字段,数据类型为"BLOB".我想知道是否可以直接从命令行客户端上传该字段中的图像,而不是通过php进行...如果有可能,那么我应该在哪里放置我的图像文件?
这里https://developer.mozilla.org/en/WebSockets/WebSockets_reference/MessageEvent它指出属性数据类型为DOMString | Blob | ArrayBuffer.我怎么告诉它我想要哪种类型?或者我怎么知道我得到的是哪种类型?
blob ×10
mysql ×3
android ×2
database ×2
javascript ×2
php ×2
arraybuffer ×1
cursor ×1
fileapi ×1
html5 ×1
http-headers ×1
image ×1
java ×1
jdbc ×1
limit ×1
memory ×1
performance ×1
postgresql ×1
search ×1
size ×1
sqlalchemy ×1
sqlite ×1
streaming ×1
websocket ×1