2010-12-28 21 views
0

AndroidクライアントからPythonサーバーに画像を送信しようとしていますが、Pythonテストクライアントとサーバーでこれまでに達成しました。基本的に私のクライアントアプリケーションは、ユーザーの詳細と画像からなるフォームをとります。ユーザーが画像を選択すると、私はonActivityResultメソッドでURIを取得し、ユーザーのヒットは、送信アクティビティがフォームデータとしてで呼び出され、フォーム上のボタンを提出するときにソケットを使用して画像ファイルをPythonに送信

selectedImagePath = selectedImageUri.toString();

のような文字列にそれを解析しますそのようなバンドル内の配列に追加します。送信活動の

Bundle b=new Bundle(); b.putStringArray("regValues", new String[]{name,email,selectedImagePath});

私は、サーバーとの接続を確立し、そのように画像を送信しようとします。

` //これは、サーバに何の問題を接続しないサーバー

try{ 

    //refer to the host computer's loopback interface 
    host = InetAddress.getByName("10.0.2.2"); 
    link = new Socket(host,port); 
    in = new BufferedReader(new InputStreamReader(link.getInputStream())); 

    //access the strings that were passed to this activity 
    Bundle b = this.getIntent().getExtras(); 
    String[] regFormValues = b.getStringArray("regValues"); 

    //display connection confirmation 

    String message = in.readLine(); 
    status.setText(message); 



     File myFile = new File (regFormValues[2]); 
     byte [] mybytearray = new byte [(int)myFile.length()]; 
     FileInputStream fis = new FileInputStream(myFile); 
     BufferedInputStream bis = new BufferedInputStream(fis); 
     bis.read(mybytearray,0,mybytearray.length); 
     OutputStream os = link.getOutputStream(); 

     os.write(mybytearray,0,mybytearray.length); 
     os.flush(); 
     link.close(); 





    } 
    catch(IOException e){ 

    e.printStackTrace(); 

    } 
    ` 

とのリンクを確立し、 サーバーは通常どおりにデータを書き込むために、出力用のファイルを作成しますが、それだけでなしので、空表示されますデータが受信されています。私はそれがクライアント側のファイルパスに問題があると思う。何か案は ?

編集:基本的に私は正しい方法で画像ファイルにアクセスしているのか、それともアクセスして送信するための良い提案があるのか​​を知りたいと思います。 tcpdumpの使用 -

+0

私はクライアントに接続されたサーバーのメッセージを受け取っているので、これまでのところ、サーバー側で空のファイルが取得されています。サーバーはpythonクライアントを使用して送信しています画像を受信する。私はそれがクライアントのファイルと関係があると思う。 – Shpongle

答えて

0

カメラで撮影した場合はuse selectedImageUri = Uri.fromFile(photo);、ファイルブラウザで選択した場合はselectedImageUri = data.getData();となり、解決しました。私はselectedImagePath = selectedImagePath.substring(7);を使ってファイルを取り除きました://カメラの画像パスを形成し、/ sdcard/etcまたはそれがどこに格納されているかを示します。ファイルブラウザで選択した画像のファイルパスを取得するにはこれを使用しました。

// convert the image URI to the direct file system path of the image file 
public String getRealPathFromURI(Uri contentUri) { 

    // can post image 
    String [] proj={MediaStore.Images.Media.DATA}; 
    Cursor cursor = managedQuery(contentUri, 
      proj, // Which columns to return 
      null,  // WHERE clause; which rows to return (all rows) 
      null,  // WHERE clause selection arguments (none) 
      null); // Order-by clause (ascending by name) 
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 

    return cursor.getString(column_index); 

これは期待どおりに動作します。

0

画像もワイヤーに当たる場合もチェック

画像が実際にあるかどうかが(例えばFile.existsなどの方法を用いて検討)及びFile.isFile()パスがOKであるかどうかを検証することとro wireshark

+0

File.exists()とFile.isFile()の両方がファイルを見ないことを確認する。ファイルは存在するので、どのように私がそれにアクセスしているのでしょうか。私が現在取り組んでいるのは、ファイルを選択してuriを返すことです。それを解析して文字列を送信アクティビティに渡し、ファイルを送信するためにファイルを開こうとしています。 – Shpongle

+0

あなたは、「File.exists()とFile.isFile()の両方が、ファイルmyFile.isFile()を推測していることを確認します。 bis.readの後にmybytearrayの画像が見えますか? – Abhi

+0

os.flush()の後にos.close()が表示されません - これが理由です。 – Abhi

関連する問題