2013-04-26 45 views
1

在我的應用程序中,我試圖上傳一個圖像在grails服務器上,問題是將圖像轉換爲基本64格式不被接受在後端,服務器開發人員說它不應該是多部分形式。
這裏是我的代碼:在android中上傳圖像到服務器而不改變多部分形式

 ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
    Bitmap bitmap = BitmapFactory.decodeFile(imagePath);   

    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream); //compress to which format you want. 
    byte [] byte_arr = stream.toByteArray(); 
    String image_str = Base64.encodeToString(byte_arr,Base64.DEFAULT); 

    nameValuePairs.add(new BasicNameValuePair("fileupload",image_str)); 


    nameValuePairs.add(new BasicNameValuePair("message", "trial")); 

    try{ 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(serverURL); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     HttpResponse response = httpclient.execute(httppost); 
     Log.i(TAG, " http reponse is:" +response); 
     convertResponseToString(response); 
    }catch(Exception e){ 
      System.out.println("Error in http connection "+e.toString()); 
    } 

回答

0

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="" 
    android:id="@+id/tv" 
    /> 
    <TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello" 
    /> 
<Button android:text="Browse gallery" 
    android:id="@+id/Button01" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
</Button> 
<ImageView android:id="@+id/ImageView01" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
</ImageView> 
</LinearLayout> 

uploadfile.java

public class uploadfile extends Activity { 
    TextView tv = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     tv = (TextView) findViewById(R.id.tv); 
     doFileUpload(); 
    } 

    private void doFileUpload(){ 

      HttpURLConnection conn = null; 
      DataOutputStream dos = null; 
      DataInputStream inStream = null; 


      String exsistingFileName = "/sdcard/six.3gp"; 
      // Is this the place are you doing something wrong. 

      String lineEnd = "\r\n"; 
      String twoHyphens = "--"; 
      String boundary = "*****"; 


      int bytesRead, bytesAvailable, bufferSize; 

      byte[] buffer; 

      int maxBufferSize = 1*1024*1024; 

      String urlString = "http://192.168.1.5/upload.php"; 



      try 
      { 


      Log.e("MediaPlayer","Inside second Method"); 

      FileInputStream fileInputStream = new FileInputStream(new File(exsistingFileName)); 



      URL url = new URL(urlString); 

      conn = (HttpURLConnection) url.openConnection(); 

      conn.setDoInput(true); 

      // Allow Outputs 
      conn.setDoOutput(true); 

      // Don't use a cached copy. 
      conn.setUseCaches(false); 

      // Use a post method. 
      conn.setRequestMethod("POST"); 

      conn.setRequestProperty("Connection", "Keep-Alive"); 

      conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary); 


      dos = new DataOutputStream(conn.getOutputStream()); 

      dos.writeBytes(twoHyphens + boundary + lineEnd); 
      dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + exsistingFileName +"\"" + lineEnd); 
      dos.writeBytes(lineEnd); 

      Log.e("MediaPlayer","Headers are written"); 



      bytesAvailable = fileInputStream.available(); 
      bufferSize = Math.min(bytesAvailable, maxBufferSize); 
      buffer = new byte[bufferSize]; 



      bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

      while (bytesRead > 0) 
      { 
      dos.write(buffer, 0, bufferSize); 
      bytesAvailable = fileInputStream.available(); 
      bufferSize = Math.min(bytesAvailable, maxBufferSize); 
      bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
      } 



      dos.writeBytes(lineEnd); 

      dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

      BufferedReader in = new BufferedReader(
          new InputStreamReader(
          conn.getInputStream())); 
       String inputLine; 

       while ((inputLine = in.readLine()) != null) 
        tv.append(inputLine); 




      // close streams 
      Log.e("MediaPlayer","File is written"); 
      fileInputStream.close(); 
      dos.flush(); 
      dos.close(); 


      } 
      catch (MalformedURLException ex) 
      { 
       Log.e("MediaPlayer", "error: " + ex.getMessage(), ex); 
      } 

      catch (IOException ioe) 
      { 
       Log.e("MediaPlayer", "error: " + ioe.getMessage(), ioe); 
      } 


      //------------------ read the SERVER RESPONSE 


      try { 
       inStream = new DataInputStream (conn.getInputStream()); 
       String str; 

       while ((str = inStream.readLine()) != null) 
       { 
        Log.e("MediaPlayer","Server Response"+str); 
       } 
       /*while((str = inStream.readLine()) !=null){ 

       }*/ 
       inStream.close(); 

      } 
      catch (IOException ioex){ 
       Log.e("MediaPlayer", "error: " + ioex.getMessage(), ioex); 
      } 



     } 
} 

AndroidManifest.xml中

<uses-permission android:name="android.permission.INTERNET" /> 

upload.php的

<?php 

move_uploaded_file($_FILES['uploadedfile']['tmp_name'], "./".$_FILES["uploadedfile"]["name"]); 

?> 
+0

你有沒有java的服務器端代碼的例子。我的意思,而不是PHP,我們可以寫在Java。 – 2013-07-15 06:28:52

0

我建議你使用multipartEntitiy的例子是這樣的:

 HttpResponse response; 
     HttpClient myClient = new DefaultHttpClient(); 
     HttpPost myConnection = new HttpPost(YOUR_URL_HERE); 

     MultipartEntity mpEntity = new MultipartEntity(
       HttpMultipartMode.BROWSER_COMPATIBLE); 

     if (Photo != null) { 

      mpEntity.addPart("photo", new ByteArrayBody(Photo, 
        "YOURPHOTO.png")); 
     } 

     try { 

      if (Photo != null) { 
       myConnection.setEntity(mpEntity); 
      } 

      response = myClient.execute(myConnection); 
     } 

     catch (Exception e) { 
      result.setResult(BaseID.REQUEST_DATA_MEMBER_CREATE_FAILED); 
      result.setError_title("Exeption Title"); 
      result.setError_message("Exeption Messege"); 
      e.printStackTrace(); 
     } 

我希望你能理解我的答案,如果您有任何問題關於我的回答,請隨時在評論中提問:)

+0

多部分實體無法解析爲某個類型。 – user1472202 2013-04-26 06:14:02

+0

Photo的數據類型是byte []照片,你設置它是正確的嗎? – 2013-04-26 06:16:04

+0

我是否需要添加任何jar文件,因爲它顯示實體未解析(MultipartEntity mpEntity = new MultipartEntity( HttpMultipartMode.BROWSER_COMPATIBLE);)這一行本身。 – user1472202 2013-04-26 07:11:15

相關問題