2015-04-29 48 views
1

我想從android上傳圖像到php服務器服務器工作都很好爲ios使用目標c,但在android我不知道如何上傳圖像。我曾嘗試下面的代碼,但服務器返回消息(圖像格式不正確或丟失的圖像文件上傳圖像在Php服務器在Android上編程

 ArrayList<File> imageFiles= new ArrayList<File>(); 
     for(int i=0;i<mCameraDataList.size();i++) { 
      File f = new File(getFilesDir(),"image"+i+".jpg"); 
      f.createNewFile(); 
      Bitmap bitmap = Bitmap.createScaledBitmap(
        BitmapFactory.decodeByteArray(mCameraDataList.get(i), 0, mCameraDataList.get(i).length),CommonMethods.getDeviceWidth(this), CommonMethods.getDeviceHeight(this), true); 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 90, stream); 
      byte[] bitmapdata = stream.toByteArray(); 
      FileOutputStream fos = new FileOutputStream(f); 
      fos.write(bitmapdata); 
      fos.flush(); 
      fos.close(); 
      imageFiles.add(f); 
     } 

    public static void postProduct(ArrayList<File> nImages) throws UnsupportedEncodingException { 
     MultipartEntityBuilder entity=MultipartEntityBuilder.create(); 
     entity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 
     entity.addPart("authenticity",new StringBody("1")); 
     entity.addPart("brand_id",new StringBody("1")); 
     entity.addPart("cat_id",new StringBody("2")); 
     entity.addPart("color_id1",new StringBody("2")); 
     entity.addPart("color_id2",new StringBody("3")); 
     entity.addPart("condition_id",new StringBody("3")); 
     entity.addPart("description",new StringBody("Bgvv")); 
     entity.addPart(Constants.KeyValues.DEVICE_ID,new StringBody(Constants.DEVICE_ID)); 
     entity.addPart("images",new StringBody("images")); 
     entity.addPart("lon",new StringBody("74.344630")); 
     entity.addPart("lat",new StringBody("31.516762")); 
     entity.addPart("name_brand",new StringBody("2 puffs")); 
     entity.addPart("package_size",new StringBody("0")); 
     entity.addPart("selling_price", new StringBody("20")); 
     entity.addPart("title",new StringBody("My test")); 
     entity.addPart(Constants.KeyValues.UID,new StringBody(String.valueOf(CommonObjects.getUserProfile().getUid()))); 
     for(int i=0;i<nImages.size();i++) 
     { 
      File f=new File(nImages.get(i).getAbsolutePath()); 
      if(f.exists()){ 
       entity.addPart(Constants.KeyValues.IMAGES, new FileBody(f, "image/jpeg")); 
      } 
     } 
     new SetDataToServer(Constants.NetworkServiceMethods.Product.POST_PRODUCT, entity, new SetDataToServer.SetDataNotifier() { 
      @Override 
      public void onDataReceived(boolean isError, String message, JSONObject jsonObj) { 
       ArrayList<String> postProductResult =new ArrayList<String>(); 
       try { 
        Log.e("JSON",jsonObj.toString()); 
        if (!jsonObj.isNull(Constants.KeyValues.DATA)) { 
         JSONObject jsonObjectData = jsonObj.getJSONObject(Constants.KeyValues.DATA); 
//      postProductResult.add(jsonObjectData.getString(Constants.KeyValues.CON_ID)); 
//      postProductResult.add(jsonObjectData.getString(Constants.KeyValues.ORDER_ID)); 
        } 
       } catch (JSONException e) { 
        isError = true; 
        message = "Sorry! Error occurred in data parsing"; 
       } 
       productHandlerMethods.onPostProductResult(isError, message, postProductResult); 
      } 
     }).callServerToSetData(); 
    } 

任何機構可以告訴我在做什麼錯。

服務器端代碼

public function postproduct_post() { 
     $brand_id = $this->post('brand_id'); 
     if ($brand_id == '') { 
      $brand_name = $this->post('name_brand'); 
      if ($brand_name == '') 
       $this->create_error(-1); 
      $brand_id = $this->Mproduct->insertBrandName($brand_name); 
     } else { 
      if (!$this->Mproduct->_checkBrandId($brand_id)) 
       $this->create_error(-15, 'brand_id'); 
     } 

     $time = time(); 
     $uid = $this->post('uid'); 
     $cat_id = $this->post('cat_id'); 
     $title = $this->post('title'); 
     $description = $this->post('description'); 
     $condition_id = $this->post('condition_id'); 
     $authenticity = $this->post('authenticity'); 

     $color_id1 = $this->post('color_id1', 0); 
     $color_id2 = $this->post('color_id2', 0); 

     $selling_price = $this->post('selling_price'); 
     $package_size = $this->post('package_size'); 
     $lat = $this->post('lat'); 
     $lon = $this->post('lon'); 

     if ($uid == '' || $cat_id == '' || $title == '' || $description == '' 
       || $color_id1 == '' || $condition_id == '' || $authenticity == '') { 
      $this->create_error(-1); 
     } 

     if (!$this->Muser->_checkUid($uid)) 
      $this->create_error(-10); 

     if (!$this->Mproduct->_checkCatId($cat_id)) 
      $this->create_error(-15, 'cat_id'); 

     if ($color_id1 > 0 && !$this->Mproduct->_checkColorId($color_id1)) { 
      $this->create_error(-15, 'color_id1'); 
     } 

     if ($color_id2 > 0 && !$this->Mproduct->_checkColorId($color_id2)) { 
      $this->create_error(-15, 'color_id2'); 
     } 
     $images = isset($_FILES['images']) ? $_FILES['images'] : null; 
     if ($images == null || count($images['name']) <= 0) { 
      $this->create_error(-21); 
     } 

     $this->load->model('Mfile'); 

     if (!$this->Mfile->checkArrayImage($images)) { 
      $this->create_error(-13); 
     } 

     if (!$this->Mproduct->_checkConditionId($condition_id)) { 
      $this->create_error(-15, 'condition_id'); 
     } 

     $params = array(); 
     $params['owner_id'] = $uid; 
     $params['cat_id'] = $cat_id; 
     $params['title'] = $title; 
     $params['added'] = $time; 
     $params['brand_id'] = $brand_id; 
     $params['description'] = $description; 
     $params['is_sell'] = 1; 
     $params['size_id'] = 101; 
     $params['is_swap'] = 0; 
     $params['is_give'] = 0; 
     $params['color_id1'] = $color_id1; 
     $params['color_id2'] = $color_id2; 
     $params['condition_id'] = $condition_id; 
     $params['authenticity'] = $authenticity; 
     $params['lat'] = $lat; 
     $params['lon'] = $lon; 
     $params['last_activity'] = $time; 
     $params['last_comment'] = ''; 
     $params['status'] = 1; 

     if ($selling_price != '') 
      $params['selling_price'] = $selling_price; 
     if ($package_size != '') 
      $params['package_size'] = $package_size; 

     $product_id = $this->Mproduct->insertProduct($params); 
     if ($product_id == -1) { 
      $this->create_error(-16); 
     } 

     $paths = $this->Mfile->saveArrayImage($images, $product_id, $time); 
     if (count($paths) <= 0) { 
      $this->create_error(-13); 
     } 

     $params = array(); 
     $params['image'] = $this->Mfile->createThumbProduct($paths[0]); 
     $params['status'] = 1; 
     $this->Mproduct->updateAfterInsertProduct($product_id, $params); 
     $this->Mproduct->upItemInCat($cat_id); 
     $this->Mproduct->upItemInBrand($brand_id); 
     $this->Muser->upItemOfUser($uid); 

     $this->Mproduct->insertProductImage($product_id, $paths); 
     //$this->Mfeed->insertNotifyNewProduct($time, $uid, $product_id); 
     //$this->Mpush->createNotiAddProduct($uid, $product_id); 
     $uids = $this->Mproduct->getUidsFollowUser($uid); 
     $this->load->model('Mnotify'); 
     $this->Mnotify->createNotifyMany($uids, $product_id, $uid, 7, array('product_id' => $product_id, 'uid' => $uid)); 
     $this->Mfeed->insertFeedWhenSell($time, $product_id); 

     $data = array(); 
     $data['product_id'] = $product_id; 
     $this->create_success($data, 'Add success');   
    } 
+0

不需要。因爲您應該先告訴我們圖像應以何種格式發送。 – greenapps

+0

'File f = new File(nImages.get(i).getAbsolutePath());'。你的意思是:'File f = nImages.get(i);'。 – greenapps

+0

這些圖像是用JPG格式寫成的,代碼如下: –

回答

2

嘗試通過下面寫在Android的服務上傳圖片,確保圖片的路徑是在下面的代碼正確,將圖像中的SD卡:

public class MyService extends Service { 
    SharedPreferences sharedPref; 
    SharedPreferences.Editor editor; 
    int serverResponseCode = 0; 
    String upLoadServerUri = null; 

    private static final String TAG = "com.example.ServiceExample"; 

    @Override 
    public void onCreate() { 
     Log.i(TAG, "Service onCreate"); 
     sharedPref = getSharedPreferences("myfiles", MODE_PRIVATE); 
     /************* Php script path ****************/ 
     upLoadServerUri = "http://myserver/uploadimage.php"; 

    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     Log.i(TAG, "Service onStartCommand " + startId); 

     final int currentId = startId; 

     Runnable r = new Runnable() { 
      public void run() { 

       for (int i = 0; i < 3; i++) { 
        // long endTime = System.currentTimeMillis() + 10*1000; 

        // while (System.currentTimeMillis() < endTime) { 
        synchronized (this) { 
         try { 

          uploadFile(sharedPref.getString(i + "", "")); 

         } catch (Exception e) { 
         } 

        } 
        // } 
        Log.i(TAG, "Service running " + currentId); 
       } 
       stopSelf(); 
      } 
     }; 

     Thread t = new Thread(r); 
     t.start(); 
     return Service.START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     Log.i(TAG, "Service onBind"); 
     return null; 
    } 

    @Override 
    public void onDestroy() { 
     Log.i(TAG, "Service onDestroy"); 
    } 

    public int uploadFile(String sourceFileUri) { 

     String fileName = sourceFileUri; 

     HttpURLConnection conn = null; 
     DataOutputStream dos = null; 
     String lineEnd = "\r\n"; 
     String twoHyphens = "--"; 
     String boundary = "*****"; 
     int bytesRead, bytesAvailable, bufferSize; 
     byte[] buffer; 
     int maxBufferSize = 1 * 1024 * 1024; 
     // File sourceFile = new 
     // File(Environment.getExternalStorageDirectory(),sourceFileUri); 
     File sourceFile = new File(Environment.getExternalStorageDirectory() 
       .getAbsolutePath() + "/" + fileName); 
     if (!sourceFile.isFile()) { 

      return 0; 

     } else { 
      try { 

       // open a URL connection to the Servlet 
       FileInputStream fileInputStream = new FileInputStream(
         sourceFile); 
       URL url = new URL(upLoadServerUri); 

       // Open a HTTP connection to the URL 
       conn = (HttpURLConnection) url.openConnection(); 
       conn.setDoInput(true); // Allow Inputs 
       conn.setDoOutput(true); // Allow Outputs 
       conn.setUseCaches(false); // Don't use a Cached Copy 
       conn.setRequestMethod("POST"); 
       conn.setRequestProperty("Connection", "Keep-Alive"); 
       conn.setRequestProperty("ENCTYPE", "multipart/form-data"); 
       conn.setRequestProperty("Content-Type", 
         "multipart/form-data;boundary=" + boundary); 
       conn.setRequestProperty("uploaded_file", fileName); 

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

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

       // create a buffer of maximum size 
       bytesAvailable = fileInputStream.available(); 

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

       // read file and write it into form... 
       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); 

       } 

       // send multipart form data necesssary after file data... 
       dos.writeBytes(lineEnd); 
       dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

       // Responses from the server (code and message) 
       serverResponseCode = conn.getResponseCode(); 
       String serverResponseMessage = conn.getResponseMessage(); 

       Log.i("uploadFile", "HTTP Response is : " 
         + serverResponseMessage + ": " + serverResponseCode); 

       if (serverResponseCode == 200) { 

       } 

       // close the streams // 
       fileInputStream.close(); 
       dos.flush(); 
       dos.close(); 

      } catch (MalformedURLException ex) { 

       ex.printStackTrace(); 

       Log.e("Upload file to server", "error: " + ex.getMessage(), ex); 
      } catch (Exception e) { 

       e.printStackTrace(); 

       Log.e("Upload file to server Exception", 
         "Exception : " + e.getMessage(), e); 
      } 

      return serverResponseCode; 

     } // End else block 
    } 

} 
+0

我不這麼認爲,這將適用於我的條件,因爲在我的代碼我必須發送其他信息與圖像和服務器端只有文件形式的圖像是可以接受的 –

+1

上述代碼只顯示圖像的多部分上傳,您需要添加其餘的部分,是的可以發送其他信息通過張貼到網址 – KOTIOS

相關問題