zoukankan      html  css  js  c++  java
  • 图像保存问题

    今天与我师傅讨论图像保存问题时,又发现一个好东西。

    图像保存的模式,我经历过两种方法:一种是保存到数据库中,它的好处是开发起来简单,只要两个读写IMAGE字段的函数就可以搞定,服务器不必另外再开服务,数据存在哪里我也不管,文件名是什么也不必操心,存在的问题是数据库变大得很快,如果是每天都要备份,那一定是个噩梦,还有读写的时间相对会长一些,因为为了在客户端显示,必须在客户端建立临时文件。

    另一种是放到共享目录中,它的好处也是开发起来简单,文件上传与读取显示的函数比前面的还要短得多。存在的问题好像更多,服务器开放文件共享端口,文件存放要对应好来,既然能让用户上传,则目录还要允许读写,如果用户高兴起来,把目录中的全部文件删光光,我们哭都来不及。我曾经想出一种方法,用两个连接来处理,一个目录共享两次,一次用于文件读取,它是只读共享,另一个用于文件上传,设为某个帐户可完全访问,隐藏,程序中用该帐户上传文件。但由于配置不容易,稳定性差,天生就有安全隐患,所以也失败。

    今天找到一个平衡点,就是显示图像用只读共享目录,而上传文件使用BCP功能。

    以前没有用过BCP,今天试了一下,问题还挺多的,先试一段代码:
    create table ##tb(aa varchar(1000))  
    insert into ##tb  
      select '<html>'  
      union all select '<head>'  
      union all select '<title>测试</title>'  
      union all select '</head>'  
      union all select '<body>'  
      union all select '你好,测试中'  
      union all select '</body>'  
      union all select '</html>'  

    --生成test.htm文件  
    exec master..xp_cmdshell 'bcp ##tb out c:\test.htm /P"" /c'

    --删除临时表  
    drop table ##tb  
    测试成功,确实在服务器端生成了一个文件。那我们再扩展开来:
    如果要导出的不是一整个表,而是某一些或一条记录,可以使用queryout
    exec master..xp_cmdshell 'bcp "select RR from KSMIS.dbo.T10WJM where BH=''00050''" queryout C:\1.JPG -T -f C:\D1.fmt'
    queryout后面跟要导出的文件名。
    -T是指采用信任连接。
    -f是指要使用指定文件的格式导出。要做文件格式还挺麻烦的,在没做文件格式之前,可以将-f C:\D1.fmt用-n来代替,但导出的结果却是前面多了四个字节,图片不像图片。

    如果不带参数地运行BCP,则会列出所有的参数。
    exec master..xp_cmdshell 'bcp'或在服务器命令提示符下直接输入BCP
    用法:  bcp {dbtable | query} {in | out | queryout | format} datafile
      [-m maxerrors]            [-f formatfile]          [-e errfile]
      [-F firstrow]             [-L lastrow]             [-b batchsize]
      [-n native type]          [-c character type]      [-w wide character type]
      [-N keep non-text native] [-V file format version] [-q quoted identifier]
      [-C code page specifier]  [-t field terminator]    [-r row terminator]
      [-i inputfile]            [-o outfile]             [-a packetsize]
      [-S server name]          [-U username]            [-P password]
      [-T trusted connection]   [-v version]             [-R regional enable]
      [-k keep null values]     [-E keep identity values]
      [-h "load hints"]
    格式文件可以先由BCP生成,然后加以修改,最后应用于实际字段的导出。根据以上命令行后,写出这样的SQL语句来导出:
    exec master..xp_cmdshell 'bcp BSMIS.dbo.T10WJM format nul -T -n -f C:\D.fmt'
    导出的文件是文本文件,类似以下内容:
    8.0
    1
    1       SQLIMAGE      0       0       ""                        1     RR       ""
    第一行是SQL的版本,第二行说明字段的个数,第三行是每个字段的说明,最原始导出来的是好多字段,我把其它的给删除了。并且IMAGE字段的第三个参数是4:
    1       SQLIMAGE      4       0       ""                        1     RR       ""
    我估计是导致前面会多四个字节的原因,把它改为0就正常了。

  • 相关阅读:
    Flask框架学习教程 汇总篇
    git版本管理工具
    Django-rest framework框架 汇总篇
    数据库学习之路 汇总篇
    Web后端开发学习教程 汇总篇
    Django框架学习教程 汇总篇
    Web前端开发学习教程 汇总篇
    Python开发之爬虫 汇总篇
    Python从入门到放弃 汇总篇
    flask之SQLAlchemy
  • 原文地址:https://www.cnblogs.com/yzx99/p/1195345.html
Copyright © 2011-2022 走看看