2011-12-23 125 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