2011-12-23 123 views
1

Hy。Windows Phone 7 - 將文件上傳到FTP服務器

我在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; 
       } 
      } 
     } 
    } 

這是whic我想上傳文件的代碼:

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();方法的程序回答:

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

我覺得你的問題就出在線路:

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(); 
} 

然後用e.ChosenPhoto作爲第一個參數調用UploadFile