diff --git a/server/src/Controllers.cs b/server/src/Controllers.cs
index d910b3d..ecd5411 100644
--- a/server/src/Controllers.cs
+++ b/server/src/Controllers.cs
@@ -184,15 +184,48 @@ public class JtagController : ControllerBase
else { return TypedResults.InternalServerError(ret.Error); }
}
+ ///
+ /// 通过Jtag下载比特流文件
+ ///
+ /// 设备地址
+ /// 设备端口
+ /// 比特流文件(最大32MB)
[HttpGet("DownloadBitstream")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async ValueTask DownloadBitstream(string address, int port, IFormFile file)
{
- var jtagCtrl = new JtagClient.Jtag(address, port);
- var ret = await jtagCtrl.DownloadBitstream();
+ // 检查文件
+ if (file is null || file.Length <= 0)
+ throw new ArgumentException("Empty file", nameof(file));
- if (ret.IsSuccessful) { return TypedResults.Ok(ret.Value); }
- else { return TypedResults.InternalServerError(ret.Error); }
+ // 定义缓冲区大小(例如:1MB)
+ const int bufferSize = 1024 * 1024; // 1MB
+ byte[] buffer = new byte[bufferSize];
+ long totalBytesRead = 0;
+
+ // 使用异步流读取文件
+ using (var memoryStream = new MemoryStream())
+ {
+ using (var stream = file.OpenReadStream())
+ {
+ int bytesRead;
+ while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0)
+ {
+ await memoryStream.WriteAsync(buffer, 0, bytesRead);
+ totalBytesRead += bytesRead;
+ }
+ }
+
+ // 将所有数据转换为字节数组(注意:如果文件非常大,可能不适合完全加载到内存)
+ byte[] fileBytes = memoryStream.ToArray();
+
+ // 下载比特流
+ var jtagCtrl = new JtagClient.Jtag(address, port);
+ var ret = await jtagCtrl.DownloadBitstream(fileBytes);
+
+ if (ret.IsSuccessful) { return TypedResults.Ok(ret.Value); }
+ else { return TypedResults.InternalServerError(ret.Error); }
+ }
}
}
diff --git a/server/src/JtagClient.cs b/server/src/JtagClient.cs
index d515763..9119f25 100644
--- a/server/src/JtagClient.cs
+++ b/server/src/JtagClient.cs
@@ -532,6 +532,9 @@ class Jtag
public async ValueTask> DownloadBitstream(byte[] bitstream)
{
+ // Clear Data
+ await MsgBus.UDPServer.ClearUDPData(this.address);
+
{
var ret = await CloseTest();
if (!ret.IsSuccessful) throw ret.Error;