Загрузите большие файлы в.NET

Разделители, используемые при извлечении из потока, зависят от действующего в настоящее время locale. Один (громоздкий) способ изменить поведение при извлечении - создать новую локаль со специальным facet, в котором вы указываете свои собственные разделители. В приведенном ниже примере новая локаль используется для непосредственного добавления std::stringstream вместо std::cin. Часть создания фасета - это в основном копирование / вставка из других ответов здесь, на SO, поэтому вы найдете множество других примеров.

#include <iostream>
#include <locale>    // std::locale, std::ctype<char>
// https://en.cppreference.com/w/cpp/locale/ctype_char
#include <sstream>   // std::stringstream
#include <algorithm> // std::copy_n
#include <vector>    // a container to store stuff in

// facet to create our own delimiters
class my_facet : public std::ctype<char> {
    mask my_table[table_size];
public:
    my_facet(size_t refs = 0)
        : std::ctype<char>(&my_table[0], false, refs)
    {
        // copy the "C" locales table to my_table
        std::copy_n(classic_table(), table_size, my_table);
        // and create our delimiter specification
        my_table[' '] = (mask)space;
        my_table['\t'] = (mask)space;
        my_table[','] = (mask)space;
    }
};

int main() {
    std::stringstream ss;
    // create a locale with our special facet
    std::locale loc(std::locale(), new my_facet);
    // imbue the new locale on the stringstream
    ss.imbue(loc);

    while(true) {
        std::string line;
        std::cout << "Enter sentence: ";
        if(std::getline(std::cin, line)) {
            ss.clear(); // clear the string stream from prior errors etc.
            ss.str(line); // assign the line to the string stream

            std::vector<std::string> words; // std::string container to store all words in
            std::string word; // for extracting one word

            while(ss>>word) { // extract one word at a time using the special facet
                std::cout << "  \"" << word << "\" is " << word.size() << " chars\n";
                // put the word in our container
                words.emplace_back(std::move(word));
            }
            if(words.size()>=2) {
                std::cout << "The second word, \"" << words[1] << "\", is " << words[1].size() << " chars\n";
            } else {
                std::cout << "did not get 2 words or more...\n";
            }
        } else break;
    }
}
11
задан Jon Seigel 19 March 2010 в 19:09
поделиться

5 ответов

1) Действительно ли возможно возобновить загрузку файла на клиенте, не используя флэш-память/Java/Silverlight?

Нет. Сам фактический протокол HTTP не поддерживает резюме о частичных загрузках, поэтому даже при использовании флэш-памяти или Silverlight необходимо было бы все еще использовать что-то еще как FTP на сервере.
Я "решил" эту проблему в прошлом путем записи пользовательского клиентского приложения в C#, который разломал файл на маленькие блоки (2meg), передал их отдельно, и затем сервер комбинирует их всех назад вместе.

2) У кого-либо есть некоторый код или ссылка на статью, которая объясняет, как записать HTTPHandler.NET, который позволит передавать потоком загрузку и ajax индикатор выполнения?

В то время как это не решает проблему 'резюме', я использовал SWFUpload на стороне клиента, и это работало блестяще. Это обеспечивает умный файловый браузер (где можно предложить пользователю только jpeg файлы, и т.д.), и загрузите отслеживание прогресса, все, не будучи должен изменить сервер вообще.

6
ответ дан 3 December 2019 в 10:05
поделиться

Не возможно возобновить загрузку с помощью стандартного элемента управления вводом файла HTML, потому что целый файл отправлен с Запросом HTTP.

Я использовал NeatUpload в прошлом, который дает Вам индикатор выполнения. Это находится под лицензией LGPL, таким образом, Вы не должны платить за него, и это - открытый исходный код.

4
ответ дан 3 December 2019 в 10:05
поделиться

Ничто больше для добавления о проблеме резюме. Я использовал (и продолжите использовать), telerik radUpload и я довольно удовлетворены им (это может даже использоваться в среднем доверительном режиме, который был довольно важен для меня). Единственная проблема я имел (и не смог зафиксировать), должен загрузить файлы, больше, чем 2 ГБ...

0
ответ дан 3 December 2019 в 10:05
поделиться

SlickUpload является довольно солидным, и много крупных компаний использует его от того, что говорит сайт.

0
ответ дан 3 December 2019 в 10:05
поделиться

Возможно, это слишком поздно для вашего проекта, но POW Upload реализовал автоматическую загрузку резюме в своей новой версии. Мы собираемся реализовать это на нашем сайте.

0
ответ дан 3 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: