Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET Core
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 768

Использовать ftp в Blazor WebAssembly

20.10.2021, 14:15. Показов 5675. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Blazor WebAssembly умеет вообще работать с ftp?
Если использовать дефолтный код

C#
1
2
3
4
5
6
7
8
 FtpWebRequest ftp = (FtpWebRequest)HttpWebRequest.Create(ftpfullpath);
            //ftp.Credentials = new NetworkCredential("login", "password");
            ftp.KeepAlive = false;
            ftp.UseBinary = true;
            ftp.UsePassive = false;
            ftp.Proxy = null;
            ftp.Method = WebRequestMethods.Ftp.MakeDirectory;
            FtpWebResponse resp = (FtpWebResponse)ftp.GetResponse();
То получаю ошибку "System.Net.Requests is not supported"
Собственно гугл говорит использовать "HttpClient", но там нет FTP как в "WebRequestMethods.Ftp"
Нужно просто создать папку, поместить туда файл и потом посмотреть что там лежит.
Делать через api не хотелось бы(
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.10.2021, 14:15
Ответы с готовыми решениями:

Blazor WebAssembly App sql connection string
Класс ApplicationDbContext public class ApplicationDbContext : DbContext { public...

Опасно ли использовать подключение к FTP?
Добрый вечер! В Windows Forms используется подключение к фтп серверу, безопасно ли это? Можно ли как-то имея только *.exe файл, дабыть...

FTP подключение. nsFTP: как использовать?
Добрый вечер! Недавно начал изучать C++, но никак не могу понять логику анализа ошибок и метод программирования на нём. При любом...

24
Эксперт .NET
 Аватар для Usaga
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,895
21.10.2021, 04:20
onimor, не забывайте, что код WebAssembly исполняется в браузере. Соответственно, этому коду доступны только те возможности, которые предоставляет браузер. И прямые запросы по FTP такие возможности не подразумевают. Как и голые сокеты, на которых можно было бы реализовать протокол FTP.

Цитата Сообщение от onimor Посмотреть сообщение
Делать через api не хотелось бы(
Но это самый корректный путь. Как минимум потому, что FTP не шифруется, в отличие от HTTPS, на основе которого будет ваш API.
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 768
21.10.2021, 06:13  [ТС]
Usaga, ftps . Но в целом ясно, спасибо. Осталось придумать как отправлять файлы через gRPC. Байтами по кусочкам такое себе
0
Эксперт .NET
 Аватар для Usaga
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,895
21.10.2021, 06:47
Цитата Сообщение от onimor Посмотреть сообщение
Байтами по кусочкам такое себе
Почему?
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 768
21.10.2021, 14:13  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Почему?
Потому что никогда таким не занимался и придется начать с нуля, натыкаясь на все грабли

Добавлено через 5 часов 11 минут
Окей.
blazor клиент
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
IList<IBrowserFile> files = new List<IBrowserFile>();
    private async void UploadFiles(InputFileChangeEventArgs e)
    {
        foreach (var file in e.GetMultipleFiles())
        {
            files.Add(file);
            using (var ms = file.OpenReadStream(file.Size))
            {
                var result  = new StreamContent(ms, Convert.ToInt32(file.Size));
                var bytes  = await result.ReadAsByteArrayAsync();
                using var serverStream = GreeterClient.DownloadFileAsync(new FileRequest  { FileName = file.Name, FileBytes = Google.Protobuf.ByteString.CopyFrom(bytes)});
                var stream = await serverStream.ResponseAsync;
                var resultStatus = stream.Status;
            }
        }
    }
gRPC сервер
C#
1
2
3
4
5
6
7
8
9
10
11
public override Task<StatusRequest> DownloadFile(FileRequest request, ServerCallContext context)
        {
            var fileBytes = request.FileBytes;
            var bytes = fileBytes.ToByteArray();
            string filename = @$"D:\123\{request.FileName}";
            File.WriteAllBytes(filename, bytes);
            return Task.FromResult(new StatusRequest
            {
                Status = filename + "|" + bytes.Count()
            });
        }
Работает для файлов меньше 4 мб, как мне разбить на части большие файлы?
0
338 / 327 / 154
Регистрация: 29.10.2012
Сообщений: 949
21.10.2021, 16:04
Цитата Сообщение от onimor Посмотреть сообщение
Работает для файлов меньше 4 мб, как мне разбить на части большие файлы?
Допустим у нас есть набор байт - src_data, разбивать на длину length, то:
Пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
class Program
{
    static void Main(string[] args)
    {
        byte[] src_data = Encoding.UTF8.GetBytes($"public override Task<StatusRequest> ...");
        int length = 10;
        var to_send = SplitData(src_data, length); // разбить данные на части длиной length 
        var res_data = MergeData(to_send);         // объединить данные 
    } 
 
    private static byte[] MergeData(List<byte[]> data)
    {
        List<Package> packages = new List<Package>();
        foreach (var item in data)
        {
            string json = item.GZipDecompress();
            Package package = JsonConvert.DeserializeObject<Package>(json);
            packages.Add(package);
        }
        if (packages.Count > 0 && packages[0].t == packages.Count)
        {
 
            var src_bytes = packages
                .OrderBy(x => x.c)
                .Select(x => x.d)
                .ToArray();
            List<byte> result = new List<byte>();
            for (int i = 0; i < src_bytes.Length; i++)
            {
                result.AddRange(src_bytes[i]);
            }
            return result.ToArray();
        }
        return default;
    }
 
 
    private static List<byte[]> SplitData(byte[] src_data, int length)
    {
        int counter = length;
        var group_data = src_data.GroupBy(_ => counter++ / length)
            .Select(v => v.ToArray()).ToArray();
 
        List<byte[]> result = new List<byte[]>();
        for (int i = 0; i < group_data.Length; i++)
        {
            var package = new Package
            {
                c = i,
                d = group_data[i],
                t = group_data.Count()
            };
            byte[] data = JsonConvert.SerializeObject(package).GZipComptess();
            result.Add(data);
        }
        return result;
    }
}
 
class Package
{
    // CurrentNumber
    public int c { get; set; }
    // TotalCount
    public int t { get; set; }
    // Data
    public byte[] d { get; set; }
}
 
static class StringExtension
{
    public static byte[] GZipComptess(this string s)
    {
        var encoding = Encoding.UTF8;
        using (var outputStream = new MemoryStream())
        {
            using (var compressionStream = new GZipStream(outputStream, CompressionMode.Compress))
            using (var inputStream = new MemoryStream(encoding.GetBytes(s)))
                inputStream.CopyTo(compressionStream);
            return outputStream.ToArray();
        }
    }
 
    public static string GZipDecompress(this byte[] s)
    {
        var encoding = Encoding.UTF8;
        using (var outputStream = new MemoryStream())
        {
            using (var inputStream = new MemoryStream(s))
            using (var compressionStream = new GZipStream(inputStream, CompressionMode.Decompress))
                compressionStream.CopyTo(outputStream);
            return encoding.GetString(outputStream.ToArray());
        }
    }
}
из недостатков примера, добавление к каждому пакету байт служебных данных, что приводит к некоторому увеличению пакета.
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 768
21.10.2021, 16:53  [ТС]
kmaffa, думаю ничего страшного, что будет чуть больше. В основном это документы, максимум 150мб какая нибудь рарная пдфка ( в теории )

Добавлено через 16 секунд
Завтра попробую
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 768
22.10.2021, 11:59  [ТС]
kmaffa, Доходит до метода SplitData и зависает без ошибок
C#
1
2
3
4
5
6
7
using (var ms = item.OpenReadStream(item.Size))
             {
                var result  = new StreamContent(ms, Convert.ToInt32(item.Size));
                var bytes  = await result.ReadAsByteArrayAsync();
                var sblitDates = FileHelper.Сonverter.SplitData(bytes,10);
                ShowMessage(sblitDates.Count.ToString());
             }
Добавлено через 34 минуты
Можно сделать тупо так
C#
1
2
3
4
5
services.AddGrpc(options =>
            {
                options.MaxReceiveMessageSize = 150 * 1024 * 1024; // 150 MB
                options.MaxSendMessageSize = 155 * 1024 * 1024; // 155 MB
            });
Но оперативы жрется на 120 мб файл 1.3 гига, что на сервере, что на клиенте и того 2.6 гига - отправить файл 120 мб))

Добавлено через 1 минуту
не прикольно

Добавлено через 1 час 54 минуты
C#
1
result.ReadAsByteArrayAsync()
Эта фигня отжирает гиг оперативы от файла 100мб
0
338 / 327 / 154
Регистрация: 29.10.2012
Сообщений: 949
22.10.2021, 13:15
Много памяти съедает group by, надо будет переделать на чтение из потока или чтение частями.
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 768
22.10.2021, 21:31  [ТС]
kmaffa, Ваш код у меня не заработал.

Добавлено через 4 часа 45 минут
Немного ясности файл был 120 мб, а оперативы сожрало 1.5 гига
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 768
25.10.2021, 14:48  [ТС]
Чет вообще все грустно с файлами..
Окей пускай жрет оперативы гиг , но и скачать с сервера файл больше 3.5 мб проблема. JS не дает
0
338 / 327 / 154
Регистрация: 29.10.2012
Сообщений: 949
25.10.2021, 16:15
Цитата Сообщение от onimor Посмотреть сообщение
Окей пускай жрет оперативы гиг , но и скачать с сервера файл больше 3.5 мб проблема. JS не дает
А зачем скачивать с помощью JS файлы с сервера - это точно надо делать? не проще ли вернуть FileResult:
C#
1
2
3
4
5
6
public FileResult Download()
{
    byte[] fileBytes =  //...
    string fileName = "myfile.ext";
    return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Pdf, fileName);
}
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 768
26.10.2021, 08:22  [ТС]
Цитата Сообщение от kmaffa Посмотреть сообщение
А зачем скачивать с помощью JS файлы с сервера - это точно надо делать?
Нагуглил что это единственный способ скачать файл с сервера на пк клиента.

C#
1
return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Pdf, fileName);
File это что?

Добавлено через 1 минуту
Цитата Сообщение от onimor Посмотреть сообщение
скачать файл с сервера
Ну в принципе если нужно откуда угодно скачать
0
338 / 327 / 154
Регистрация: 29.10.2012
Сообщений: 949
26.10.2021, 11:00
Цитата Сообщение от onimor Посмотреть сообщение
скачать файл с сервера
Ну в принципе если нужно откуда угодно скачать
JS - Скачивание
JavaScript
1
2
3
var link = document.createElement('a');
link.href = new URL('http://localhost:5000/Home/Download');
link.click();
c# - метод контроллера
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using Microsoft.AspNetCore.Mvc;
 
namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        public FileResult Download()
        {
            byte[] fileBytes = System.IO.File.ReadAllBytes("file_path");
            //byte[] fileBytes = Encoding.UTF8.GetBytes("Text");
            string fileName = "file_name.ext";
            return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Pdf, fileName);
        }
    }
}
Добавлено через 26 минут
Цитата Сообщение от onimor Посмотреть сообщение
Но оперативы жрется на 120 мб файл 1.3 гига, что на сервере, что на клиенте и того 2.6 гига - отправить файл 120 мб))
Как уже описывал проблему выше, много памяти съедает group by.
Можно заменить строки 38 и 39 из post15788187
C#
1
2
        var group_data = src_data.GroupBy(_ => counter++ / length)
            .Select(v => v.ToArray()).ToArray();
На вот такой код:
C#
1
    var group_data = src_data.Split(length).ToArray();
Где Split - класс расширение для разделения исходного массива
C#
1
2
3
4
5
6
7
8
9
10
11
//Класс расширение
public static class ArrSplit
{
    public static IEnumerable<byte[]> Split(this byte[] array, int size)
    {
        for (var i = 0; i < (float)array.Length / size; i++)
        {
            yield return array.Skip(i * size).Take(size).ToArray();
        }
    }
}
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 768
26.10.2021, 12:23  [ТС]
Цитата Сообщение от kmaffa Посмотреть сообщение
Как уже описывал проблему выше, много памяти съедает group by.
Это делает не ваш код, ваш код у меня вообще не работает. Страница просто перестает отвечать без ошибок

Добавлено через 21 секунду
Оператива улетает после
C#
1
result.ReadAsByteArrayAsync()
Добавлено через 1 минуту
Цитата Сообщение от kmaffa Посмотреть сообщение
c# - метод контроллера
Мне в Blazor WASM юзать MVC?
0
338 / 327 / 154
Регистрация: 29.10.2012
Сообщений: 949
26.10.2021, 12:53
Цитата Сообщение от onimor Посмотреть сообщение
Оператива улетает после
Может тогда попробовать использовать MemoryStream (если я правильно понял участок кода)
C#
1
2
3
4
5
6
7
using (var ms = file.OpenReadStream())
{
    using MemoryStream memoryStream = new MemoryStream();
    ms.CopyTo(memoryStream);
    var sblitDates = FileHelper.Сonverter.SplitData(memoryStream.ToArray(), 10);
    ShowMessage(sblitDates.Count.ToString());
}
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 768
26.10.2021, 12:57  [ТС]
Цитата Сообщение от kmaffa Посмотреть сообщение
Может тогда попробовать использовать MemoryStream (если я правильно понял участок кода)
Synchronous reads are not supported.
0
338 / 327 / 154
Регистрация: 29.10.2012
Сообщений: 949
26.10.2021, 13:04
Цитата Сообщение от onimor Посмотреть сообщение
Synchronous reads are not supported.
В какой строке? Если ms.CopyTo, то можно от так:
C#
1
 await ms.CopyToAsync(memoryStream);
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 768
26.10.2021, 13:10  [ТС]
ну да
C#
1
await ms.CopyToAsync(memoryStream);
Добавлено через 1 минуту
только все равно страница перестает отвечать

Добавлено через 2 минуты
kmaffa, файл 2.5мб , не отвечает страница и 700 мб оперативы улетело
0
338 / 327 / 154
Регистрация: 29.10.2012
Сообщений: 949
26.10.2021, 13:10
Цитата Сообщение от onimor Посмотреть сообщение
ну да
Помогло использование MemoryStream уменьшить потребление памяти?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.10.2021, 13:10
Помогаю со студенческими работами здесь

Что лучше использовать для работы с FTP?
Что лучше использовать для работы с FTP? И пример кода, если можно!

Javascript и webassembly
Недавно начал осваивать Django (Python знаю) и для написания фронтенда javascript. В планах несколько своих проектов. Но наткнулся в...

Swipl + webassembly
пробовал кто?

Установка WebAssembly
Доброго дня Установлен Qt 5.13.2. Хочу доустановить Webassembly. Запускаю MaintenanceTool, но в составе компонентов такого компонента...

Собрать Qt для использования WebAssembly
Добрый день!) С праздником вас) Пытаюсь собрать Qt в Windows 8 для использования WebAssembly. Делаю вот так: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru