H 想要将图像本身发送到本地主机 SQL 服务器(使用 ASP 核心 C# Web 服务将图像从我的计算机发送到本地主机)。我在客户端尝试过这个:
OpenFileDialog opf = new OpenFileDialog();
Image img = Image.FromFile(opf.FileName);
MemoryStream tmpStream = new MemoryStream();
img.Save(tmpStream, System.Drawing.Imaging.ImageFormat.Png);
tmpStream.Seek(0, SeekOrigin.Begin);
byte[] imageData = new byte[img.Size.Height * img.Height];
tmpStream.Read(imageData, 0, img.Size.Height * img.Height);
//string UpdateString = "UPDATE CompSett SET Logo=@image";
string Base64String = "data:image/jpeg;base64," + Convert.ToBase64String(imageData, 0, imageData.Length);
string Image2 = JsonConvert.SerializeObject(imageData);
HttpResponseMessage message = Program.client.GetAsync("UpdateImage2?UpdateString=" + UpdateString + "&image=" + Base64String).Result;
这是我在服务器端的代码:
private static SqlConnection connection = new SqlConnection();
[WebMethod]
public string UpdateImage2(string UpdateString, string image)
{
string ConnString = "Data Source=(local);Initial Catalog=HA;Integrated Security=True";
connection.ConnectionString = ConnString;
string response = string.Empty;
SqlCommand cmd = new SqlCommand();
cmd.CommandText = UpdateString;
cmd.Parameters.Clear();
cmd.Parameters.Add(new SqlParameter("@image", image));
cmd.Connection = connection;
connection.Open();
int i = cmd.ExecuteNonQuery();
if (i > 0)
{
response = "Record Updated";
}
else response = "Error";
connection.Close();
return response;
}
如果我将图像作为字符串传递(如上面的代码),我在 webmethod 中得到的字符串是“System.Byte[]”图像的总字节。 另一方面,如果我以字节形式发送图像,程序会给出以下错误: “无效的 URI:Uri 字符串太长 HttpGET”
请告诉我如何解决它?
您试图将所有图像数据作为 URI 的一部分包含在内,但这不是正确的方法。图像可能有几兆字节,而 URI 的最大长度比这短得多。
如果您要上传图片,您可能应该使用
POST
而不是 GET
。
你也不应该接受来自客户端的 SQL 命令字符串,那只是乞求 SQL 注入攻击。即使这是在受信任的环境中,这也是非常糟糕的做法。
你似乎在破坏图像。图像可以使用某种文件格式表示为“文件”,也可以表示为原始像素数据。如果您使用后者,您还需要包含一些有关大小、像素格式等的元数据。无论您对图像做什么都将不起作用。仅获取文件字节并直接传递它们应该更容易、更快、更正确。 也许是这样的:
var fileBytes = await File.ReadAllBytesAsync(opf.FileName)
using var fileContent = new ByteArrayContent(fileBytes);
using HttpResponseMessage response = await httpClient.PostAsync("UpdateImage2", fileContent );
您自然需要更改服务器以接受字节内容而不是字符串,并执行您打算用它执行的任何操作。您可能还想在对其进行任何操作之前检查文件大小,以及该文件是否处于白名单中的图像格式