Winform客户端到Java服务端的图片展示和上传

图片上传在JavaWeb方面已经有成熟的组件,那么对应到Winform(C#编写的富客户端组件)客户端到Java服务端的图片展示和上传,其实也有一套为之可行的方案。

一、效果展示

这里写图片描述

二、方案介绍(展示和上传)

  1. 展示的时候Java端将图片的路径(http://127.0.0.1:8080/Project/apple.gif,这也就是说需要一台web服务器提供http访问,这恰好对应我的项目,但可能并不适合你,请注意)传递到C#,C#通过设定private System.Windows.Forms.PictureBox对象的“ImageLocation”来进行显示。
  2. 上传的时候Winform客户端将选择的图片进行base64编码,进而通过json字符串传递到Java端,然后Java再通过base64进行解码,完成之后通过ImageIO对象进行图片的保存。

三、图片上传

“上传”按钮点击事件:

private void btnUpload_Click(object sender, EventArgs e)
{
    openFileDialog1.FileName = string.Empty;
    openFileDialog1.Filter = "Image Files(JPEG,GIF,BMP,etc.)|" +
        "*.jpg;*.jpeg;*.gif;*.bmp;*.png|" +
        "All files(*.*)|*.*";
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        string picPath = openFileDialog1.FileName;
        txtFilePath.Text = picPath;
        Image image = Image.FromFile(picPath);
        dealImage = ImageHelper.ImageToBytes(image);
        dealImageType = System.IO.Path.GetExtension(picPath);
        picDeal.ImageLocation = picPath;
    }
}
  1. 点击上传按钮时,对弹出的选择器进行图片选择类型设置。
  2. 通过文件路径转换为Image对象。
  3. 通过ImageToBytes方法对图片进行base64编码(稍候请看详细代码)。
  4. 同时获取图片的类型,jpg还是png,供Java端保存使用。

ImageToBytes方法:

public static string ImageToBytes(Image image)
{
    ImageFormat format = image.RawFormat;
    using (MemoryStream ms = new MemoryStream())
    {
        if (format.Equals(ImageFormat.Jpeg))
        {
            image.Save(ms, ImageFormat.Jpeg);
        }
        else if (format.Equals(ImageFormat.Png))
        {
            image.Save(ms, ImageFormat.Png);
        }
        else if (format.Equals(ImageFormat.Bmp))
        {
            image.Save(ms, ImageFormat.Bmp);
        }
        else if (format.Equals(ImageFormat.Gif))
        {
            image.Save(ms, ImageFormat.Gif);
        }
        else if (format.Equals(ImageFormat.Icon))
        {
            image.Save(ms, ImageFormat.Icon);
        }
        byte[] buffer = new byte[ms.Length];
        //Image.Save()会改变MemoryStream的Position,需要重新Seek到Begin
        ms.Seek(0, SeekOrigin.Begin);
        ms.Read(buffer, 0, buffer.Length);
        return Convert.ToBase64String(buffer);
    }
}

通过ToBase64String方法进行base64的编码。

这之后,将base64字节码和图片类型传递给Java服务端。

四、图片保存

public static UploadFile saveFile(String image, String type) {
    logger.debug("图片内容:" + image);
    logger.debug("---------------------------------------");

    if (image == null || "".equals(image)) {
        return null;
    }

    BASE64Decoder decoder = new BASE64Decoder();

    try {
        String fileName = DateUtil.getCurrentMillStr() + new Random().nextInt(100) + "." + type;
        UploadFile file = new UploadFile(SAVE_DIRECTORY, fileName, type);

        byte[] bytes1 = decoder.decodeBuffer(image);
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes1);
        BufferedImage bi1 = ImageIO.read(bais);
        File w2 = file.getFile();
        ImageIO.write(bi1, type, w2);

        return file;
    } catch (IOException e) {
        throw new OrderException("图片上传出错!");
    }
}
  1. 通过BASE64Decoder的decodeBuffer方法进行字节码的解码操作。
  2. 通过ImageIO对图片进行保存。

相关文章

本文出自:【沉默王二的博客

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用C#编写的一个简单示例,展示了如何在WinForms客户端服务端之间发送消息和文件。 首先,创建一个WinForms应用程序,包含两个窗体:`ClientForm`和`ServerForm`。 在`ClientForm`中,添加以下控件:一个`TextBox`用于输入消息,一个`Button`用于发送消息,一个`Button`用于选择文件,一个`Button`用于批量上传文件。 ```csharp using System; using System.IO; using System.Net.Sockets; using System.Windows.Forms; namespace Client { public partial class ClientForm : Form { private TcpClient client; public ClientForm() { InitializeComponent(); } private void ConnectToServer(string serverIP) { try { client = new TcpClient(); client.Connect(serverIP, 8888); MessageBox.Show("Connected to the server!"); } catch (Exception ex) { MessageBox.Show("Error connecting to the server: " + ex.Message); } } private void SendMessage(string message) { try { StreamWriter writer = new StreamWriter(client.GetStream()); writer.WriteLine(message); writer.Flush(); MessageBox.Show("Message sent!"); } catch (Exception ex) { MessageBox.Show("Error sending message: " + ex.Message); } } private void SendFile(string filePath) { try { FileStream fileStream = new FileStream(filePath, FileMode.Open); byte[] buffer = new byte[client.ReceiveBufferSize]; int bytesRead; NetworkStream networkStream = client.GetStream(); while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0) { networkStream.Write(buffer, 0, bytesRead); } fileStream.Close(); MessageBox.Show("File sent!"); } catch (Exception ex) { MessageBox.Show("Error sending file: " + ex.Message); } } private void btnConnect_Click(object sender, EventArgs e) { string serverIP = txtServerIP.Text; ConnectToServer(serverIP); } private void btnSend_Click(object sender, EventArgs e) { string message = txtMessage.Text; SendMessage(message); } private void btnSelectFile_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); if (openFileDialog.ShowDialog() == DialogResult.OK) { txtFilePath.Text = openFileDialog.FileName; } } private void btnSendFile_Click(object sender, EventArgs e) { string filePath = txtFilePath.Text; SendFile(filePath); } } } ``` 在`ServerForm`中,添加以下控件:一个`TextBox`用于显示接收到的消息,一个`Button`用于启动服务器。 ```csharp using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Threading; using System.Windows.Forms; namespace Server { public partial class ServerForm : Form { private TcpListener server; private Thread listenThread; public ServerForm() { InitializeComponent(); } private void StartServer() { try { server = new TcpListener(IPAddress.Any, 8888); server.Start(); MessageBox.Show("Server started!"); while (true) { TcpClient client = server.AcceptTcpClient(); Thread clientThread = new Thread(HandleClient); clientThread.Start(client); } } catch (Exception ex) { MessageBox.Show("Error starting the server: " + ex.Message); } } private void HandleClient(object clientObj) { TcpClient client = (TcpClient)clientObj; try { StreamReader reader = new StreamReader(client.GetStream()); string message = reader.ReadLine(); Invoke((MethodInvoker)delegate { txtReceivedMessage.Text = message; }); } catch (Exception ex) { MessageBox.Show("Error handling client: " + ex.Message); } finally { client.Close(); } } private void btnStart_Click(object sender, EventArgs e) { listenThread = new Thread(StartServer); listenThread.Start(); } } } ``` 以上是一个简单的示例,演示了如何在WinForms客户端服务端之间发送消息和文件。当客户端连接到服务端时,客户端可以输入消息并发送,也可以选择文件并发送。服务端接收到消息后,在界面上显示接收到的消息。 请注意,这只是一个基本示例,可能需要根据您的实际需求进行修改和扩展。例如,您可能需要添加错误处理、进度条、文件上传进度等功能。 希望以上代码能对您有所帮助!如果您有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉默王二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值