Как указать входной файл в DOM типа ‹input type='file'› с помощью AngleSharp?

Используя AngleSharp, как указать файл для заполнения <input type="file" name="myInputFile">? Я прочитал этот вопрос StackOverflow , но похоже, что это отличается от моего предполагаемого случая. Я пытаюсь заполнить форму программно, загружая файл по своему выбору.


person Nik A.    schedule 20.03.2017    source источник


Ответы (1)


Каждый IHtmlInputElement имеет свойство Files, которое можно использовать для добавления файлов.

var input = document.QuerySelector<IHtmlInputElement>("input[type=file][name=myInputFile]");
input?.Files.Add(file);

В ранее использованном примере переменная file относится к любому экземпляру IFile. AngleSharp — это PCL, не имеющая правильной реализации «из коробки», однако простая может выглядеть так:

class FileEntry : IFile
{
    private readonly String _fileName;
    private readonly Stream _content;
    private readonly String _type;
    private readonly DateTime _modified;

    public FileEntry(String fileName, String type, Stream content)
    {
        _fileName = fileName;
        _type = type;
        _content = content;
        _modified = DateTime.Now;
    }

    public Stream Body
    {
        get { return _content; }
    }

    public Boolean IsClosed
    {
        get { return _content.CanRead == false; }
    }

    public DateTime LastModified
    {
        get { return _modified; }
    }

    public Int32 Length
    {
        get
        {
            return (Int32)_content.Length;
        }
    }

    public String Name
    {
        get { return _fileName; }
    }

    public String Type
    {
        get { return _type; }
    }

    public void Close()
    {
        _content.Close();
    }

    public void Dispose()
    {
        _content.Dispose();
    }

    public IBlob Slice(Int32 start = 0, Int32 end = Int32.MaxValue, String contentType = null)
    {
        var ms = new MemoryStream();
        _content.Position = start;
        var buffer = new Byte[Math.Max(0, Math.Min(end, _content.Length) - start)];
        _content.Read(buffer, 0, buffer.Length);
        ms.Write(buffer, 0, buffer.Length);
        _content.Position = 0;
        return new FileEntry(_fileName, _type, ms);
    }
}

Более сложный вариант будет автоматически определять тип MIME и иметь перегрузки конструктора, позволяющие передавать (локальные) пути к файлам и т. д.

Надеюсь это поможет!

person Florian Rappl    schedule 13.12.2017
comment
Это определенно помогает. Спасибо! - person Nik A.; 21.02.2018