文件上传添加 test窗口

master
洁 任 8 months ago
parent 74fa884eda
commit 4d8da75e75

@ -15,6 +15,7 @@
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.3" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.3" />
<PackageReference Include="Minio" Version="6.0.4" />
<PackageReference Include="WindowsAPICodePack-Shell" Version="1.1.1" />
<PackageReference Include="WPF-UI" Version="4.0.2" />
</ItemGroup>

@ -1,13 +1,18 @@
<Window x:Class="Hopytry.MainWindow"
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Hopytry"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml" x:Class="Hopytry.MainWindow"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<ui:Button Content="Button" HorizontalAlignment="Left" Margin="270,217,0,0" VerticalAlignment="Top" Click="Button_Click"/>
<ui:ProgressRing HorizontalAlignment="Left" Margin="489,308,0,0" VerticalAlignment="Top"/>
<ProgressBar HorizontalAlignment="Left" Height="10" Margin="342,345,0,0" VerticalAlignment="Top" Width="100"/>
</Grid>
</Window>

@ -18,6 +18,8 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using FileUploader.Models;
using Hopetry.Services;
using Microsoft.Win32;
using Hopetry;
namespace Hopytry
{
@ -35,5 +37,12 @@ namespace Hopytry
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
test testWindow = new test();
testWindow.Show();
this.Close(); // 关闭当前 MainWindow
}
}
}

@ -0,0 +1,18 @@
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dlg="clr-namespace:Microsoft.Win32;assembly=PresentationFramework"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Hopetry"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml" x:Class="Hopetry.test"
mc:Ignorable="d"
Title="test" Height="450" Width="800">
<Grid>
<ui:Button Content="选择文件" HorizontalAlignment="Left" Margin="111,197,0,0" VerticalAlignment="Top" Click="Button_Click"/>
<ProgressBar Name="progressBar" HorizontalAlignment="Left" Height="10" Margin="177,277,0,0" VerticalAlignment="Top" Width="100" ValueChanged="progressBar_ValueChanged"/>
<TextBox Name="StatusText" HorizontalAlignment="Left" Margin="385,328,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
</Grid>
</Window>

@ -0,0 +1,199 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Microsoft.Win32;
using Minio;
using Minio.DataModel;
using Minio.DataModel.Args;
using Minio.DataModel.Encryption;
using Microsoft.WindowsAPICodePack.Dialogs;
using System.IO;
namespace Hopetry
{
/// <summary>
/// test.xaml 的交互逻辑
/// </summary>
public partial class test : Window
{
private IMinioClient client;
public test()
{
InitializeComponent();
// 配置 MinIO 客户端
client = new Minio.MinioClient()
.WithEndpoint("123.132.248.154:9107") // MinIO 服务器地址
.WithCredentials("KcJPKzOsKfVq20EA4Lyh", "HY7K5EkYpRUphEdINZmAq34tsZD3PMLFTnL85y4N") // 访问密钥和密钥
.Build();
}
#region 多文件上传
private void Button_Click1(object sender, RoutedEventArgs e)
{
var openFileDialog = new Microsoft.Win32.OpenFileDialog();
openFileDialog.Multiselect = true; // 可选择多个文件
openFileDialog.Filter = "All Files (*.*)|*.*";
//openFileDialog.Multiselect = false;
if (openFileDialog.ShowDialog() == true)
{
foreach (string filePath in openFileDialog.FileNames)
{
// 处理选择的文件
UploadFileToMinIOWithProgress(filePath);
}
}
}
private async void UploadFileToMinIOWithProgress(string filePath)
{
try
{
string bucketName = "test";
string objectName = System.IO.Path.GetFileName(filePath);
//判断桶是否存在
var beArgs = new BucketExistsArgs().WithBucket(bucketName);
bool found = await client.BucketExistsAsync(beArgs).ConfigureAwait(false);
if (!found)
{
var mbArgs = new MakeBucketArgs()
.WithBucket(bucketName);
await client.MakeBucketAsync(mbArgs).ConfigureAwait(false);
}
var progress = new Progress<ProgressReport>(progressReport =>
{
Dispatcher.Invoke(() =>
{
progressBar.Value = progressReport.Percentage;// 更新进度条的值
});
});
PutObjectArgs putObjectArgs = new PutObjectArgs()
.WithBucket(bucketName)
.WithObject(objectName)
.WithFileName(filePath)
//.WithContentType("application/octet-stream")
.WithProgress(progress);
// 上传文件并提供进度反馈
await client.PutObjectAsync(putObjectArgs);
MessageBox.Show("文件上传成功!");
}
catch (Exception ex)
{
MessageBox.Show($"上传失败: {ex.Message}");
}
}
#endregion
#region 文件夹选择
private void Button_Click(object sender, RoutedEventArgs e)
{
// 打开文件夹选择对话框
var dialog = new CommonOpenFileDialog
{
IsFolderPicker = true,
Title = "请选择上传文件"
};
if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
{
string folderPath = dialog.FileName;
// 处理选择的文件
UploadFileToMinIO(folderPath);
}
}
private async void UploadFileToMinIO(string folderPath)
{
try
{
string bucketName = "test";
// 检查存储桶是否存在,如果不存在则创建
var beArgs = new BucketExistsArgs().WithBucket(bucketName);
bool found = await client.BucketExistsAsync(beArgs).ConfigureAwait(false);
if (!found)
{
var mbArgs = new MakeBucketArgs()
.WithBucket(bucketName);
await client.MakeBucketAsync(mbArgs).ConfigureAwait(false);
}
// 获取文件夹中的所有文件
var files = Directory.GetFiles(folderPath, "*.*", SearchOption.AllDirectories);
int totalFiles = files.Length;
int uploadedFiles = 0;
// 更新UI显示总文件数
Dispatcher.Invoke(() => StatusText.Text = $"Uploading {totalFiles} files...");
// 遍历文件并上传
foreach (var filePath in files)
{
string objectName = filePath.Substring(folderPath.Length + 1).Replace('\\', '/');
; // 保留文件夹结构 //重点注意后面的Replace
var putObjectArgs = new PutObjectArgs()
.WithBucket(bucketName)
.WithObject(objectName)
.WithFileName(filePath);
await client.PutObjectAsync(putObjectArgs);
uploadedFiles++;
int progress = (int)((double)uploadedFiles / totalFiles * 100);
// 更新UI显示上传进度
Dispatcher.Invoke(() =>
{
progressBar.Value = progress;
StatusText.Text = $"Uploaded {uploadedFiles} of {totalFiles} files...";
});
}
// 上传完成
Dispatcher.Invoke(() =>
{
StatusText.Text = "Upload completed!";
MessageBox.Show("All files uploaded successfully!");
});
}
catch (Exception ex)
{
Dispatcher.Invoke(() =>
{
StatusText.Text = "Upload failed!";
MessageBox.Show($"Error uploading files: {ex.Message}");
});
}
}
#endregion
private void progressBar_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
}
}
}
Loading…
Cancel
Save