【问题标题】:Converting blob back to original file type and making it available for download将 blob 转换回原始文件类型并使其可供下载
【发布时间】:2012-01-25 10:05:28
【问题描述】:

所以我有一个使用 HTML5 和 JavaScript 构建的客户端应用程序。我的应用程序调用 Web 服务(使用 c# 构建),该服务从 MySql 数据库中提取 blob 数据并将其传递给客户端应用程序。

这个 blob 数据实际上是一个存储在 MySQL 数据库中的小文件(小于 100kb)。我希望我的客户端应用程序能够将此 blob 转换回其原始文件类型,然后向用户询问下载权限。现在我想知道这是否是个好主意?还是我应该简单地在我的 Web 服务中进行文件转换,然后将文件本身发送到 JSP 应用程序?

任何帮助/建议将不胜感激!如果您有任何好的教程/代码,这可能会帮助我进行转换,那么请将它们发布在这里作为答案?提前致谢!

【问题讨论】:

  • 到目前为止你有什么代码...??
  • 我的 web 服务现在只是通过了 blob...我想一旦我判断了所有的选项,我就会正确启动
  • 您是说将 blob 转换回 blob..?或者你没有说明它的原始文件类型是什么..??只是需要澄清
  • 无论您采用哪种方式,您都必须进行一些流式传输,在某些方面我会有点偏颇,比如客户端,但是如果在流式传输时遇到错误怎么办?也许是网络服务或其他网络方法可以将 Blob 以 .pdf 格式流回。这是一个开放式问题,这是你的电话。我相信其他人很快就会提出他们的建议,你很可能会将数据库中的信息读入一个字节[] 并将其流式传输回文件
  • 这个链接可能会帮助你做到最好。msdn.microsoft.com/en-us/library/87z0hy49(VS.71).aspx

标签: c# javascript download blob


【解决方案1】:

使用此示例并将 SQL 数据库更改为您的数据库以及 Select 语句

SqlConnection pubsConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=pubs;");
SqlCommand logoCMD = new SqlCommand("SELECT pub_id, logo FROM pub_info", pubsConn);

FileStream fs;                          // Writes the BLOB to a file (*.bmp).
BinaryWriter bw;                        // Streams the BLOB to the FileStream object.

int bufferSize = 100;                   // Size of the BLOB buffer.
byte[] outbyte = new byte[bufferSize];  // The BLOB byte[] buffer to be filled by GetBytes.
long retval;                            // The bytes returned from GetBytes.
long startIndex = 0;                    // The starting position in the BLOB output.

string pub_id = "";                     // The publisher id to use in the file name.

// Open the connection and read data into the DataReader.
pubsConn.Open();
SqlDataReader myReader = logoCMD.ExecuteReader(CommandBehavior.SequentialAccess);

while (myReader.Read())
{
  // Get the publisher id, which must occur before getting the logo.
  pub_id = myReader.GetString(0);  

  // Create a file to hold the output.
  fs = new FileStream("logo" + pub_id + ".bmp", FileMode.OpenOrCreate, FileAccess.Write);
  bw = new BinaryWriter(fs);

  // Reset the starting byte for the new BLOB.
  startIndex = 0;

  // Read the bytes into outbyte[] and retain the number of bytes returned.
  retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize);

  // Continue reading and writing while there are bytes beyond the size of the buffer.
  while (retval == bufferSize)
  {
    bw.Write(outbyte);
    bw.Flush();

    // Reposition the start index to the end of the last buffer and fill the buffer.
    startIndex += bufferSize;
    retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize);
  }

  // Write the remaining buffer.
  bw.Write(outbyte, 0, (int)retval - 1);
  bw.Flush();

  // Close the output file.
  bw.Close();
  fs.Close();
}

// Close the reader and the connection.
myReader.Close();
pubsConn.Close();

【讨论】:

  • 我认为这行得通..?我喜欢当事情走到一起并发挥作用时......很高兴我能提供帮助
  • 嗨@MethodMan 我正在尝试找出类似的东西。基本上我已经能够将某些文件类型保存到 SQL blob(即 .doc/.docx/pdf/jpeg...' 等),但现在需要能够通过单击按钮来显示它们。这对我的需求是否同样有效?我不知道在尝试打开时是否需要指定文件类型,这可能是个问题。谢谢
猜你喜欢
  • 2023-04-09
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多