Windows Phone 7 - Загрузить файл на FTP-сервер - PullRequest
1 голос
/ 23 декабря 2011

Hy.

Я делаю приложение в WP7, которое представляет собой FTP-сервер.Я хотел бы загрузить фотографию (с photochoosertask).

Я написал PhotoChooserTask (), в котором я мог выбрать фотографию.Программа сохранит название фотографии (samplephoto01.jpg) и маршрут фотографии.И я написал код, который отправляет команду на FTP-сервер:

    public static void Execute(String msg)
    {
        SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
        Byte[] cmd = Encoding.UTF8.GetBytes((msg + "\r\n").ToCharArray());
        socketEventArg.SetBuffer(cmd, 0, cmd.Length);
        socket.SendAsync(socketEventArg);
    }

Этот код я могу выбрать фотографию:

public void SelectAndUpLoad()
    {
        PhotoChooserTask p = new PhotoChooserTask();
        p.Completed += new EventHandler<PhotoResult>(pt_Completed);
        p.ShowCamera = true;
        p.Show();
    }

    void pt_Completed(object sender, PhotoResult e)
    {
        if (e.TaskResult == TaskResult.OK)
        {
            BitmapImage img = new BitmapImage();
            img.SetSource(e.ChosenPhoto);
            MediaLibrary library = new MediaLibrary();
            string PhotoPath = e.OriginalFileName;
           // MessageBox.Show(PhotoPath);
            for (int i = 0; i < library.Pictures.Count; i++)
            {
                Stream s = library.Pictures[i].GetImage();
                if (s.Length == e.ChosenPhoto.Length)
                {
                    string filename = library.Pictures[i].Name;
                    MessageBoxResult m = MessageBox.Show(filename, "Upload?", MessageBoxButton.OKCancel);
                    if (m == MessageBoxResult.OK)
                    {

                        Ftp.UploadFile(PhotoPath);

                    }
                    else
                    {
                        return;
                    }
                    break;
                }
            }
        }
    }

И это код, который я хотел бы загрузитьfile:

public static void UploadFile(string file)
    {
        FileStream stream = new FileStream(file, FileMode.Open);
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        Execute("STRO " + file);
        stream.Seek(0, SeekOrigin.Begin);
        stream.Close();
    }

Но когда я использую UploadFile ();method программа ответит так:

MethodAccessException не обработано

Этот код:

.
.
 Ftp.UploadFile(PhotoPath);

                    }
                    else
                    {     //MethodAccessException
                        return;
                    }
                    break;
                }

Что не так?Спасибо!


Я переписал этот код с помощью IsolatedStorage к этому:

for (int i = 0; i < library.Pictures.Count; i++)
            {
                Stream s = library.Pictures[i].GetImage();
                if (s.Length == e.ChosenPhoto.Length)
                {
                    string filename = library.Pictures[i].Name;
                    MessageBoxResult m = MessageBox.Show(filename, "Upload?", MessageBoxButton.OKCancel);
                    if (m == MessageBoxResult.OK)
                    {
                        IsolatedStorageFile iss = IsolatedStorageFile.GetUserStoreForApplication();
                        IsolatedStorageFileStream fs = iss.OpenFile(PhotoPath, FileMode.Open);
                        Ftp.UploadFile(fs, filename);
                        fs.Close();
                    }
                    else
                    {
                        return;
                    }
                    break;
                }
            }

И метод UploadFile ():

    public static void UploadFile(IsolatedStorageFileStream file, string RemoteFile)
    {
        SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
        int bytes;
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        Execute("STRO " + RemoteFile);

        file.Seek(0, SeekOrigin.Begin);
        while ((bytes = file.Read(buffer, 0, buffer.Length)) > 0)
        {
            socketEventArg.SetBuffer(buffer, bytes, 0);
            socket.SendAsync(socketEventArg);
        }

    }

Но я получаюисключение в этом источнике:

IsolatedStorageFileStream fs = iss.OpenFile(PhotoPath, FileMode.Open);

Исключение составляет: исключение IsolatedStorageException.

Что не так?

1 Ответ

1 голос
/ 23 декабря 2011

Я думаю, что ваша проблема заключается в строке:

    FileStream stream = new FileStream(file, FileMode.Open);

Невозможно открыть файлы таким способом в WP7.Чтобы получить поток в файл, вы можете либо открыть его из изолированного хранилища (при условии, что файл там хранится), либо использовать поток, предоставленный встроенным методом.

В вашем случае выесть поток со свойством e.ChosenPhoto.Почему бы вам не использовать его напрямую?

public static void UploadFile(Stream stream, string file)
{
    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    Execute("STRO " + file);
    stream.Seek(0, SeekOrigin.Begin);
    stream.Close();
}

Затем вызовите UploadFile, используя e.ChosenPhoto в качестве первого аргумента.

...