簡體   English   中英

C# 將 IFormFile 讀入 byte[]

[英]C# read IFormFile into byte[]

我正在嘗試讀取從IFormFile POST 請求收到的 IFormFile,如下所示:

 public async Task<ActionResult> UploadDocument([FromForm]DataWrapper data)
    {
        IFormFile file = data.File;
        string fileName = file.FileName;
        long length = file.Length;
        if (length < 0)
            return BadRequest();
        using FileStream fileStream = new FileStream(fileName, FileMode.OpenOrCreate);
        byte[] bytes = new byte[length];
        fileStream.Read(bytes, 0, (int)file.Length);

        ...

    }

但是出現了問題,在此行執行后:

fileStream.Read(bytes, 0, (int)file.Length);

bytes的所有元素都為零。

此外,在我的 Visual Studio 項目中創建了具有相同名稱的文件,我不希望發生這種情況。

您無法像打開磁盤上的文件一樣打開IFormFile 您必須改用IFormFile.OpenReadStream() 文檔在這里

public async Task<ActionResult> UploadDocument([FromForm]DataWrapper data)
{
    IFormFile file = data.File;

    long length = file.Length;
    if (length < 0)
        return BadRequest();

    using var fileStream = file.OpenReadStream();
    byte[] bytes = new byte[length];
    fileStream.Read(bytes, 0, (int)file.Length);

}

fileStream.Read(bytes, 0, (int)file.Length);的原因似乎是空的,因為它是。 IFormFile.Filename是請求給出的文件的名稱,並且不存在於磁盤上。

您的代碼的意圖似乎是寫入 FileStream,而不是字節緩沖區。 實際上做的是創建一個新的空文件並將其讀取到已經清除的緩沖區中。 上傳的文件永遠不會被使用。

寫入文件

如果你真的想保存文件,你可以使用CopyTo

using(var stream = File.Create(Path.Combine(folder_I_Really_Want,file.FileName))
{
    file.CopyTo(stream);
}

如果您想從上傳的文件讀取到緩沖區而不保存到磁盤,請使用 MemoryStream。 這只是一個byte[]緩沖區上的 Stream API 緩沖區。 您不必指定大小,但隨着內部緩沖區的增長,這會減少重新分配。

讀入byte[]

通過 MemoryStream 讀入一個 byte[] 本質上是一樣的:

var stream = new MemoryStream(file.Length);
file.CopyTo(stream);
var bytes=stream.ToArray();

問題是您正在根據 model 中的文件名打開一個新文件流,這將是用戶在上傳時選擇的文件名。 您的代碼將使用該名稱創建一個新的空文件,這就是您在文件系統中看到該文件的原因。 然后,您的代碼正在從該文件中讀取字節,該文件為空。

您需要使用 IFormFile.OpenReadStream 方法或 CopyTo 方法之一從 stream 獲取實際數據。

然后,您將該數據以您想要的名稱寫入文件系統上的文件。

        var filename ="[Enter or create name for your file here]";
        using (FileStream fs = new FileStream(filename, FileMode.OpenOrCreate))
        //Create the file in your file system with the name you want.
        {
            using (MemoryStream ms = new MemoryStream())
            {
               //Copy the uploaded file data to a memory stream
                file.CopyTo(ms);
               //Now write the data in the memory stream to the new file
                fs.Write(ms.ToArray());
            }
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM