Изображение. FromStream (PostedFile. InputStream) Сбои. (Параметр не допустим.) (AsyncFileUpload))

Я просто боролся с подобной проблемой. Мой состоит из поля комбинированного списка, которое отображается для каждого listitem. DataContext верхнего уровня связывается с моим viewmodel (MVVM) и похож на это:

class ViewModel{
    ObservableCollection<ComboboxListItemType> DataForTheComboBoxList;
    ObservableCollection<MyDataType> DataForTheListBox;
    ...
}

, поскольку поле комбинированного списка в ItemTemplate (=DataTemplate) для поля списка, DataContext для каждого элемента списка установлен на соответствующий объект в DataForTheListBox, поле комбинированного списка больше не может видеть DataForTheComboBoxList, в котором это нуждается от DataContext верхнего уровня.

Мой (грязный, ужасный) обходное решение включает установку полного списка поля комбинированного списка на каждом объекте в списке, таким образом, это становится видимым к DataContext в этом элементе списка.

Первый Вы делаете частичный класс для своего типа данных поля списка. (Обычно это будет прибывать из сервисной ссылки, таким образом, Вы наклоните касание сгенерированный код непосредственно, потенциально не теряя ее). Этот частичный класс содержит новое свойство, относящееся к Вашему типу элемента списка поля комбинированного списка:

public partial class MyDataType
{
    private ObservableCollection<ComboboxListItemType> m_AllComboboxItems;
    public ObservableCollection<ComboboxListItemType> AllComboboxItems
    {
        get { return m_AllComboboxItems; }
        set
        {
            if (m_AllComboboxItems != value)
            {
                m_AllComboboxItems = value;
                RaisePropertyChanged("AllComboboxItems");
            }
        }
    }
}

Следующий необходимо установить это свойство на каждом элементе в наборе DataForTheListBox

// in ViewModel class
foreach(var x in this.DataForTheListBox)
{
    x.AllComboboxItems = this.DataForTheComboBoxList;
}

Затем обратно в XAML:

<DataTemplate x:Key="ListBoxItemTemplate">
    ...
    <Combobox
        ItemsSource="{Binding AllComboboxItems}"
        SelectedItem="{Binding CurrentBlah}"/>
</DataTemplate>

не забывают, что, чтобы поле комбинированного списка правильно отобразило текущий объект, выбранный пункт должен относиться к фактический объект в ItemsSource поля комбинированного списка. Если Вы получаете данные из веб-сервиса, который имеет идентификаторы или возражает для представления объекта для поля комбинированного списка, необходимо повторно сослаться на них для указания на фактический набор.

5
задан Thomas Sandberg 23 October 2009 в 17:22
поделиться

2 ответа

Я хотел бы убедиться, что поток расположен в начале:

var file = AsyncFileUpload1.FileContent;
file.Seek(0, SeekOrigin.Begin);

var img = Image.FromFile(file);

Второе, что нужно проверить: параметр requestLengthDiskThreshold . Если не указано иное, этот параметр имеет значение по умолчанию ... да, 80 КБ.

Примечание: Я думаю, не должно быть общей разницы, используете ли вы Image для чтения файлового потока напрямую или если вы используете промежуточный MemoryStream (другой чем тот факт, что в последнем случае вы фактически дважды загружаете весь файл в память). В любом случае исходный файловый поток будет считан из, таким образом, позиция потока, права CAS,

7
ответ дан 14 December 2019 в 04:41
поделиться

Это правильно, это не сработает. Проблема в том, что вы пересекаете управляемую / неуправляемую границу, я недавно столкнулся с таким же. Другие проблемы заключаются в том, что поток находится не прямо там, и Image.FromStream не знает, как с этим бороться.

Решение довольно простое: прочтите все из WrittenFile в MemoryStream (просто используйте new MemoryStream () ) и используйте MemoryStream с Image.FromStream . Это решит вашу проблему.

Убедитесь, что правильно используете , используя , когда вы работаете с Image , Graphics и Stream s. Все они реализуют IDisposable и в среде ASP.NET, не используя с использованием блоков должным образом, могут и приведут к увеличению использования памяти и другим неприятным побочным эффектам в долгосрочной перспективе (а приложения ASP.NET это делают работать очень долго!).

Решение должно выглядеть примерно так:

using(Stream memstr = new MemoryStream())
{
    // copy to a memory stream
    Stream uploadStream = AsyncFileUpload1.PostedFile.InputStream;
    byte[] all = new byte[uploadStream.Length];
    uploadStream.Read(all, 0, uploadStream.Length);
    memstr.Write(all, 0, uploadStream.Length);
    memstr.Seek(0, SeekOrigin.Begin);
    using(Graphics g = Graphics.FromStream(memstr))
    {
         // do your img manipulation, or Save it.
    }
}

Обновление: проблема пересечения управляемой границы возникает только в обратном порядке (с использованием потока ответов), похоже, не с потоками загрузки, а Я не совсем уверен.

1
ответ дан 14 December 2019 в 04:41
поделиться
Другие вопросы по тегам:

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