SL 4: простая загрузка файлов, почему это не работает? - PullRequest
0 голосов
/ 21 сентября 2010

Я не получаю никаких исключений в следующем коде, однако я также не вижу файл, который предполагается загрузить на сервер (в данном случае локальный хост) - может кто-нибудь указать на ошибку?

В качестве дополнения мне нужен простой загрузчик файлов silverlight с индикатором выполнения, но мне очень трудно попробовать использовать те из них, которые есть в кодплексе. У кого-нибудь есть подходящий вариант для SL4?

public FileStream MyFS { get; set; }

private void UploadFile()
{
    FileStream _data; // The file stream to be read
    _data = MyFS;
    string uploadUri;
    uploadUri = @"http://localhost/MyApplication/Upload/Images/testXRay.gif";

    byte[] fileContent = new byte[_data.Length]; // Read the contents of the stream into a byte array
    int dataLength = int.Parse(_data.Length.ToString());
    _data.Read(fileContent, 0, dataLength);

    WebClient wc = new WebClient();
    wc.OpenWriteCompleted += new OpenWriteCompletedEventHandler(wc_OpenWriteCompleted);
    Uri u = new Uri(uploadUri);
    wc.OpenWriteAsync(u, null, fileContent); // Upload the file to the server
}

void wc_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e) // The upload completed
{
    if (e.Error == null)
    {
        // Upload completed without error
    }
}

Спасибо,

Voodoo

Ответы [ 2 ]

3 голосов
/ 21 сентября 2010

Вы пытаетесь записать URL-адрес сервера, который является изображением, а не службой:

uploadUri = @"http://localhost/MyApplication/Upload/Images/testXRay.gif";
...
Uri u = new Uri(uploadUri);
wc.OpenWriteAsync(u, null, fileContent);

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

Я уверен, что есть лучшие примеры, но сначала попробуйте эту ссылку .

1 голос
/ 21 сентября 2010

Другая проблема с вашим кодом заключается в том, что вы вообще не пытались записать файл.

Эта строка не делает то, что вы думаете:

wc.OpenWriteAsync (u, null, fileContent); // Загрузить файл в сервер

Подпись вызова - OpenWriteAsync (URI, HTTPMETHOD, UserToken).

Позвольте мне немного разобраться с этим. URI Я думаю, что у вас есть. HTTPMETHOD позволяет вам установить, делаете ли вы сообщение или получаете. Вероятно, вы хотите сделать HttpPost. Наконец, последний пункт не предназначен для передачи содержимого файла. Это скорее переменная состояния, поэтому вы можете отслеживать запрос (подробнее об этом чуть позже).

Способ работы стека HTTP в Silverlight заключается в том, что все асинхронно. Таким образом, вы в своем случае настраиваете запрос, а затем сообщаете среде выполнения, что хотите записать некоторые данные в запрос. Это то, что делает ваш звонок. Он выходит и настраивается, чтобы позволить вам сделать запрос (что может произойти в фоновом потоке, а не в потоке, в котором обновляется пользовательский интерфейс). Как только это настроено, оно вызовет ваше событие обратного вызова с потоком, в который вы можете записать. Одна из вещей, которую он отправляет вам обратно, - это переменная состояния (UserToken), которая дает вам возможность узнать, на какой запрос он ответил вам (что означает, что вы можете отправить несколько файлов обратно на сервер одновременно) .

Он также отображает несколько других событий, которые вы можете использовать, чтобы увидеть, все ли работает нормально (например, вы можете получить ответ на ваш звонок и посмотреть, какой код статуса был - который скажет вам, если все прошло успешно или не). Кстати, при каждом обратном вызове он отправляет эту переменную UserToken, чтобы ваше приложение могло отслеживать, на какой запрос был получен ответ (если сейчас их несколько).

Ссылки, которые предоставил последний парень, должны помочь вам. Он тоже прав, вам нужно что-то на настройке сервера, чтобы ответить на запрос, или, скорее, вы, как правило, хотите это сделать. Вы можете настроить папку, чтобы позволить вам отправлять данные непосредственно в нее, но, честно говоря, вы не хотите этого делать, поскольку открываете свой сервер для хакеров.

...