Пользовательский SchemeHandler CEF не получает POST-файл через Fetch API - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь сохранить выбранный файл в локальной папке.Вот мой код:

<!-- HTML -->
<input id="menu-upload" name="pdf" type="file" accept="application/pdf">

.

// JS
document.getElementById('menu-upload').addEventListener("change", (event) => {
    let file = event.target.files[0];
    fetch("https://pdf/upload", {
        method: "post",
        headers: {
            "Content-Type": file.type
        },
        body: file
    }).then((resp) => {
        console.log(resp);
    });
}

.

// C# .NET 4.7.2
// CefSharp.WinForms v67.0.0
cef_settings.RegisterScheme(new CefCustomScheme
{
    SchemeName = "https",
    DomainName = "pdf",
    SchemeHandlerFactory = new PdfSchemeHandlerFactory(),
    IsCorsEnabled = true
});

class PdfSchemeHandlerFactory : ISchemeHandlerFactory
{
    public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
    {
        /* This is where I'm having problems.
            Whenever I inspect `request`,
                it's `Method` is "OPTIONS"
                and PostData is null.
            See linked image. */
        return ResourceHandler.ForErrorMessage("Test", System.Net.HttpStatusCode.OK);
    }
}

Вот что я получаю .

Поскольку у меня недостаточно повторений для публикации изображений, вот ссылка

Есть ли лучшие способы передачи файловых данных из JS в C #?

1 Ответ

0 голосов
/ 10 октября 2018

Вот что я сделал, чтобы решить эту проблему, основываясь на комментариях в моем вопросе:

Вместо того, чтобы вводить file непосредственно как body запроса, я поместил его внутри FormData.

// JS
var form = new FormData();
form.append("pdf", file);

fetch("https://upload.pdf.local/" + cur_folder, {
    //fetch("http://localhost/api/" + cur_folder, {
    method: "post",
    //mode: "cors",
    headers: {
        "Content-Type": "multipart/form-data"
    },
    body: form
});

Теперь запрос OPTIONS пропал, но запрос POST по-прежнему не выполняется без установки заголовка Access-Control-Allow-Origin равным request.ReferrerUrl.

// C# .NET 4.7.2
// CefSharp.WinForms v67.0.0
public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
    // .......
    Directory.CreateDirectory(folder);

    var filename = DateTime.UtcNow.ToString("yyyy-MM-dd-HH-mm") + ".pdf";

    folder = Path.Combine(folder, filename);
    File.Copy(data.File, folder, false);

    var rh = (ResourceHandler)ResourceHandler.ForErrorMessage("Yay!", System.Net.HttpStatusCode.OK);
    rh.Headers["Access-Control-Allow-Origin"] = "https://viewer.pdf.local";
    return rh;
    // .......
}
...