Получение файла CSV с помощью действия HTTP POST в C# - PullRequest
0 голосов
/ 03 мая 2020

У меня есть PHP код, который будет принимать файл CSV и перемещать его в каталог на сервере. Я изо всех сил пытаюсь сделать то же самое, используя C# консольное приложение. NET 4.7.2 Framework

Я видел несколько видео о C# веб-программировании, но запутался между методами сокетов, составители списков и TCP / IP. Я был бы очень признателен, если бы кто-то смог перевести приведенный ниже код в C#, поэтому у меня будет хотя бы рабочий пример, чтобы начать экспериментировать и учиться.

СПАСИБО!

$target_dir = __dir__ . '/uploads';
$default_datasource = 'unknown';
$accepted_mimes = ['text/csv'];

####################

// Make sure the request has expected fields.
if (isset($_POST['action']) && $_POST['action'] === 'upload') {
    $file_path = $target_dir . '/' . ($_POST['datasource'] ?? $default_datasource) . '/' . $_FILES['file']['name'];
    $file_dir  = dirname($file_path);
    $file_mime = $_FILES['file']['type'];
    $file_name = $_FILES['file']['name'];

    if (!in_array($file_mime, $accepted_mimes, true)) {
        $accepted_mimes = implode(',', $accepted_mimes);
        throw new RuntimeException("Invalid file type: '{$file_mime}'. Only {$accepted_mimes} is acceptable");
    }

    if (file_exists($file_path)) {
        throw new RuntimeException('File already exists');
    }

    if (!is_dir($file_dir)) {
        if (!mkdir($file_dir) && !is_dir($file_dir)) {
            throw new RuntimeException(sprintf('Directory "%s" was not created', $file_dir));
        }
    }


    if (move_uploaded_file($_FILES['file']['tmp_name'], $file_path)) {
        echo 'OK';

    } else {
        throw new RuntimeException('Failed to upload file');
    }


}

1 Ответ

0 голосов
/ 03 мая 2020

C# консольные приложения являются клиентскими приложениями. С вашим консольным приложением будет взаимодействовать только тот, кто напрямую использует установленный P C. PHP - серверный язык, доступ к которому можно получить через inte rnet по протоколу HTTP.

Мы не можем написать ваше приложение для вас здесь, на SO, но я могу указать вам верное направление. Задайте себе вопрос: почему вы хотите использовать консольное приложение C#? Нужно ли мне это приложение для работы через inte rnet, или это нормально для его работы локально / офлайн?

Если ваш заголовок правильный, и вы хотите использовать HTTP Post, вам нужно будет сделать серверное C# приложение - НЕ консольное приложение (которое не будет работать). Я бы рекомендовал вам взглянуть на ASP. net Core MVC, который, как вы могли бы сказать, является выбором по умолчанию для C# серверных приложений.


Вот пример кода Я нашел в MSDN приложение asp. net CORE C#:

1) Создание примера приложения Razor Pages

2) Создание новой страницы Razer Pages / BufferedSingleFileUploadPhysical. cs html

3) Добавьте следующий код

BufferedSingleFileUploadPhysical.CS HTML (Razer Page)

<form enctype="multipart/form-data" method="post">
<dl>
    <dt>
        <label asp-for="FileUpload.FormFile"></label>
    </dt>
    <dd>
        <input asp-for="FileUpload.FormFile" type="file">
        <span asp-validation-for="FileUpload.FormFile"></span>
    </dd>
</dl>
<input asp-page-handler="Upload" class="btn" type="submit" value="Upload" />

Источник: https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1

...