C#如何从数据库中正确保存二进制映像文件?

时间:2016-06-20 15:03:27

标签: c#

我正尝试从数据库导出员工图像,将其保存到我的计算机上,然后将其上传到每个员工的帐户中的Salesforce。我的问题是我从数据库中保存文件的方式一定存在问题。当我向Salesforce上传从数据库中提取的图片文件时,它告诉我"此时您的文件无法上传。请在几分钟后再试一次#34;但是,当我通过电子邮件将个人图片发送给自己,下载它,然后上传该图片时,它就可以了。 (我试图集体这样做;它不起作用)。我得出的结论是问题可能与代码有关。该照片存储为varbinary(max)并保存为.png.jpeg类型,并使用MSDN代码的变体从数据库中提取:

   SqlConnection connection = new SqlConnection(connectionString);
   SqlCommand command = new SqlCommand(queryString, connection);

   connection.Open();
   SqlDataReader myReader = command.ExecuteReader(CommandBehavior.SequentialAccess);

   while (myReader.Read())
   {
      filePath = @"C:\Users\npredey\Documents\Photos_from_database\" + myReader["first_name"] + '_' + myReader["last_name"];
      FileStream fs = new FileStream(filePath + ".gif", FileMode.OpenOrCreate, FileAccess.Write); // creates a new file for output

      bw = new BinaryWriter(fs);

      startIndex = 0;
      retval = myReader.GetBytes(3, startIndex, outbyte, 0, bufferSize);

      while (retval == bufferSize)
      {
         bw.Write(outbyte);
         bw.Flush();

         startIndex += bufferSize;
         retval = myReader.GetBytes(3, startIndex, outbyte, 0, bufferSize);
      }

      bw.Write(outbyte, 0, (int)retval - 1);
      bw.Flush();

      bw.Close();
      fs.Close();
   }
   myReader.Close();
   connection.Close();

文件的保存方式是否会出现问题?无法上传文件?我已使用所有三个可接受的扩展程序(.gif.jpg.png)保存了该文件,但这些扩展程序均无效。

1 个答案:

答案 0 :(得分:1)

在最后一次写作时,你不应该从retval中减去1。

retval包含读取的字节数。 BinaryWriter.Write的第三个参数是要写入的字节数。

由于你想要写所有字节,你应该只传递retval而不是retval - 1,这样可以保留最后一个字节不被写入。