SOMS/test/FileUploadWpf/MainWindow.xaml.cs

290 lines
10 KiB
C#
Raw Permalink Normal View History

2024-07-15 10:31:26 +08:00
using Microsoft.Win32;
using Newtonsoft.Json;
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Threading;
using System.Windows;
namespace FileUploadWpf
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
/// <summary>
/// 上传的文件路径。
/// </summary>
private string[] filePaths;
/// <summary>
/// 上传的文件续传点。
/// </summary>
private long startPoint;
private string baseUrl = @"http://localhost:9091/api/services/isas/";
private string relativePath = @"\InspectionItemResult\2020\03-03\测试二_test33_065148\";
public MainWindow()
{
InitializeComponent();
}
/// <summary>
/// 上传按钮点击事件。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Multiselect = true;
if (openFileDialog.ShowDialog() == true)
{
this.filePaths = openFileDialog.FileNames;
ThreadStart ts = new ThreadStart(ResumeFileThread);
Thread t = new Thread(ts);
t.Start();
}
}
public void ResumeFileThread()
{
this.Dispatcher.Invoke(() =>
{
this.lb_log.Items.Clear();
});
if (this.filePaths != null && this.filePaths.Length > 0)
{
foreach (string filePath in this.filePaths)
{
string result = ResumeFile(filePath, relativePath, startPoint, 1024 * 128);
this.Dispatcher.Invoke(() =>
{
this.lb_log.Items.Add(filePath + ":" + result);
});
}
}
}
public string ResumeFile(string fromFileFullPath, string toRelativePath, long startPoint, int byteCount)
{
string hostUrl = baseUrl + "InspectionItemResult/FileUpload";
string result = "上传成功!";
byte[] data;
string fileName = System.IO.Path.GetFileName(fromFileFullPath);
FileStream fs = new FileStream(fromFileFullPath, FileMode.Open, FileAccess.Read);
long fileLength = fs.Length;
BinaryReader bReader = new BinaryReader(fs);
try
{
#region
if (startPoint == fileLength)
{
result = "文件秒传!";
}
if (startPoint >= 1 && startPoint <= fileLength - 1)
{
fs.Seek(startPoint, SeekOrigin.Current);
}
#endregion
#region
for (; startPoint <= fileLength - 1; startPoint = startPoint + byteCount)
{
int step = 0;
if (startPoint + byteCount > fileLength)
{
data = new byte[Convert.ToInt32(fileLength - startPoint)];
bReader.Read(data, 0, Convert.ToInt32(fileLength - startPoint));
step = Convert.ToInt32(fileLength - startPoint);
}
else
{
data = new byte[byteCount];
bReader.Read(data, 0, byteCount);
step = byteCount;
}
string contentRange = "bytes " + startPoint + "-" + (startPoint + step) + "/" + fs.Length;
RequestEasyResult rst = HttpHelper.HttpPostRequest<RequestEasyResult>(hostUrl + "?fileName=" + fileName + "&relativePath=" + toRelativePath, data, contentRange);
this.Dispatcher.Invoke(() =>
{
this.tb_filePath.Text = fromFileFullPath + "||" + rst.Message;
this.tb_uploadData.Text = (startPoint + step) + "/" + fileLength;
});
}
#endregion
}
catch (Exception ex)
{
result = ex.Message;
}
bReader.Close();
fs.Close();
return result;
}
public string ResumeFile_old(string fromFileFullPath, string toRelativePath, long startPoint, int byteCount)
{
string hostUrl = baseUrl + "InspectionItemResult/FileUpload";
string result = "上传成功!";
byte[] data;
string fileName = System.IO.Path.GetFileName(fromFileFullPath);
WebClient webClient = new WebClient();
FileStream fs = new FileStream(fromFileFullPath, FileMode.Open, FileAccess.Read);
long fileLength = fs.Length;
BinaryReader bReader = new BinaryReader(fs);
try
{
#region
if (startPoint == fileLength)
{
result = "文件秒传!";
}
if (startPoint >= 1 && startPoint <= fileLength - 1)
{
fs.Seek(startPoint, SeekOrigin.Current);
}
#endregion
#region
for (; startPoint <= fileLength - 1; startPoint = startPoint + byteCount)
{
int step = 0;
if (startPoint + byteCount > fileLength)
{
data = new byte[Convert.ToInt32(fileLength - startPoint)];
bReader.Read(data, 0, Convert.ToInt32(fileLength - startPoint));
step = Convert.ToInt32(fileLength - startPoint);
}
else
{
data = new byte[byteCount];
bReader.Read(data, 0, byteCount);
step = byteCount;
}
webClient.Headers.Remove(HttpRequestHeader.ContentRange);
webClient.Headers.Add(HttpRequestHeader.ContentRange, "bytes " + startPoint + "-" + (startPoint + step) + "/" + fs.Length);
byte[] rstBytes = webClient.UploadData(hostUrl + "?fileName=" + fileName + "&relativePath=" + toRelativePath, "POST", data);
string rstStr = Encoding.UTF8.GetString(rstBytes);
this.Dispatcher.Invoke(() =>
{
this.tb_filePath.Text = fromFileFullPath + "||" + rstStr;
this.tb_uploadData.Text = (startPoint + step) + "/" + fileLength;
});
}
#endregion
}
catch (Exception ex)
{
result = ex.Message;
}
bReader.Close();
fs.Close();
return result;
}
#region
/// <summary>
/// 允许拖拽。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, RoutedEventArgs e)
{
this.AllowDrop = true;
}
#endregion
}
public class HttpHelper
{
/// <summary>
/// http请求POST方式
/// </summary>
/// <param name="url">请求连接</param>
/// <param name="dicParams">请求参数</param>
/// <returns>根据泛型返回响应值</returns>
public static T HttpPostRequest<T>(string url, byte[] buffer, string contentRange = null, string accessToken = null)
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);//webrequest请求api地址
request.Method = "POST";
//request.Accept = "text/html, application/xhtml+xml, */*"; //"text/html, application/xhtml+xml, */*";
request.ContentType = "multipart/form-data";
if (!string.IsNullOrWhiteSpace(contentRange))
request.Headers.Add("Content-Range", contentRange);
if (!string.IsNullOrEmpty(accessToken))
request.Headers.Add("Authorization", "Bearer" + " " + accessToken);
if (buffer != null)
{
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
}
return GetResponseValue<T>(request);
}
catch (Exception ex)
{
throw ex;
}
}
private static T GetResponseValue<T>(HttpWebRequest request)
{
try
{
T rstObj = default(T);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
rstObj = JsonConvert.DeserializeObject<T>(reader.ReadToEnd());
reader.Close();
reader.Dispose();
}
response.Close();
return rstObj;
}
catch (Exception ex)
{
throw ex;
}
}
}
public class RequestEasyResult
{
private bool _flag;
private string _msg;
public bool Flag
{
get
{
return _flag;
}
set
{
_flag = value;
}
}
public string Message
{
get
{
return _msg;
}
set
{
_msg = value;
}
}
}
}