2017-07-14 14 views
0

私はボレーに問題があります。私は初心者ですから ボレーで画像をアップロードするサンプルを探しましたが、 で働く私のコードアンドロイドにアヤックス(ボレーと同じことをやろうとしている)。次のコードは、android volley Multipartを使ってやりたいことです。いくつかのヒントや例が素晴らしいでしょう。私はあなたから聞くのが大好きです!AJAXのようなボレーのアンドロイドでポストリクエストを送ることができません

$.ajax({ 
     type: 'post', 
     processData: false, 
     contentType: false, 
     data: "/imagepath/sample.PNG", 
     url: "https://linktotheimageuploader/upload", 
     async: true, 
     success: function (res) { 
      if (res.status == 0) { 
       console.log(res); 
      } else { 
       // NOP 
      } 
     } 
     , error: function() { 
      //failed to upload 
     } 
    }); 

私は次のようなアンドロイドをボレーするためにそれを変換しようとしたが、私は私がやりたいことを達成することができません。

ます。public void uploadImage(文字列のURL、最終ファイルfilename){

final File encodedString = fileName; 
RequestQueue rq = Volley.newRequestQueue(this); 
Log.d("URL", url); 
StringRequest stringRequest = new StringRequest(Request.Method.POST, 
     url, new Response.Listener<String>() { 

    @Override 
    public void onResponse(String response) { 
     try { 
      Log.e("RESPONSE", response); 
      JSONObject json = new JSONObject(response); 

      Toast.makeText(getBaseContext(), 
        "The image is upload" +response, Toast.LENGTH_SHORT) 
        .show(); 

     } catch (JSONException e) { 
      Log.d("JSON Exception", e.toString()); 
      Toast.makeText(getBaseContext(), 
        "Error while loadin data!", 
        Toast.LENGTH_LONG).show(); 
     } 

    } 

}, new Response.ErrorListener() { 

    @Override 
    public void onErrorResponse(VolleyError error) { 
     Log.d("ERROR", "Error [" + error + "]"); 
     Toast.makeText(getBaseContext(), 
       "Cannot connect to server", Toast.LENGTH_LONG) 
       .show(); 
    } 
}) { 
    @Override 
    protected Map<String, String> getParams() { 
     Map<String, String> params = new HashMap<String, String>(); 
     params.put(encodedString); // I want to set the file not a String, 

     return params; 

    } 

}; 
rq.add(stringRequest); 

}

答えて

0

はまず、MultipartUploadRequestでサーバーからのコールバックを取得するには、UploadServiceBroadcastReceiver

public class SingleUploadBroadcastReceiver extends UploadServiceBroadcastReceiver { 

    public interface Delegate { 
     void onProgress(int progress); 
     void onProgress(long uploadedBytes, long totalBytes); 
     void onError(Exception exception); 
     void onCompleted(int serverResponseCode, byte[] serverResponseBody); 
     void onCancelled(); 
    } 

    private String mUploadID; 
    private Delegate mDelegate; 

    public void setUploadID(String uploadID) { 
     mUploadID = uploadID; 
    } 

    public void setDelegate(Delegate delegate) { 
     mDelegate = delegate; 
    } 

    @Override 
    public void onProgress(String uploadId, int progress) { 
     if (uploadId.equals(mUploadID) && mDelegate != null) { 
      mDelegate.onProgress(progress); 
     } 
    } 

    @Override 
    public void onProgress(String uploadId, long uploadedBytes, long totalBytes) { 
     if (uploadId.equals(mUploadID) && mDelegate != null) { 
      mDelegate.onProgress(uploadedBytes, totalBytes); 
     } 
    } 

    @Override 
    public void onError(String uploadId, Exception exception) { 
     if (uploadId.equals(mUploadID) && mDelegate != null) { 
      mDelegate.onError(exception); 
     } 
    } 

    @Override 
    public void onCompleted(String uploadId, int serverResponseCode, byte[] serverResponseBody) { 
     if (uploadId.equals(mUploadID) && mDelegate != null) { 
      mDelegate.onCompleted(serverResponseCode, serverResponseBody); 
     } 
    } 

    @Override 
    public void onCancelled(String uploadId) { 
     if (uploadId.equals(mUploadID) && mDelegate != null) { 
      mDelegate.onCancelled(); 
     } 
    } 
} 
を拡張することにより、クラスを作成します

あなたの活動の中で:

public class YourActivity extends Activity implements SingleUploadBroadcastReceiver.Delegate { 

    private static final String TAG = "AndroidUploadService"; 

    private final SingleUploadBroadcastReceiver uploadReceiver = 
     new SingleUploadBroadcastReceiver(); 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     uploadReceiver.register(this); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     uploadReceiver.unregister(this); 
    } 

    public void uploadMultipart(final Context context) { 
     try { 
      String uploadId = UUID.randomUUID().toString(); 
      uploadReceiver.setDelegate(this); 
      uploadReceiver.setUploadID(uploadId); 

      new MultipartUploadRequest(context, uploadId, "http://upload.server.com/path") 
       .addFileToUpload("/absolute/path/to/your/file", "your-param-name") 
       .setNotificationConfig(new UploadNotificationConfig()) 
       .setMaxRetries(2) 
       .startUpload(); 

     } catch (Exception exc) { 
      Log.e(TAG, exc.getMessage(), exc); 
     } 
    } 

    @Override 
    public void onProgress(int progress) { 
     //your implementation 
    } 

    @Override 
    public void onProgress(long uploadedBytes, long totalBytes) { 
     //your implementation 
    } 

    @Override 
    public void onError(Exception exception) { 
     //your implementation 
    } 

    @Override 
    public void onCompleted(int serverResponseCode, byte[] serverResponseBody) { 
     //your implementation 
    } 

    @Override 
    public void onCancelled() { 
     //your implementation 
    } 

} 
+0

可能であれば、私は単純なVolley – Tony

0

Iは、2つの異なる方法でボレーでこれを行っている:

  1. マルチパート

がエンコードされた文字列として送信するよう画像送信Base64でエンコードされた文字列

  • として画像を送信

    このメソッドは、リクエストでパラメータとして送信できるBase64文字列にビットマップをエンコードします。次に、サーバーは文字列をデコードしてイメージに戻すことができます。マルチパートとして送信

    public String bitmapToString(Bitmap bmp){ 
        ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
        bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
        byte[] imageBytes = baos.toByteArray(); 
        String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT); 
    
        return encodedImage; 
    } 
    
    StringRequest stringRequest = new StringRequest(Request.Method.POST, 
         url, new Response.Listener<String>() { 
    
        @Override 
        public void onResponse(String response) { 
    
        }, new Response.ErrorListener() { 
    
        @Override 
        public void onErrorResponse(VolleyError error) { 
    
        } 
    
    }) { 
        @Override 
        protected Map<String, String> getParams() { 
         Map<String, String> params = new HashMap<String, String>(); 
         params.put("image", bitmapToString(BitmapFactory.decodeFile(filePath))); 
    
         return params; 
        } 
    
    }; 
    

    このもう少しトリッキーなあなたには、いくつかの男の名前anggadarkprinceによって作られたカスタムクラスを使用する必要がありますので、ですが、それは最初のオプションよりも道高速です

    VolleyMultipartRequest multipartRequest = new VolleyMultipartRequest(Request.Method.POST, url, new Response.Listener<NetworkResponse>() { 
         @Override 
         public void onResponse(NetworkResponse response) { 
    
         } 
        }, new Response.ErrorListener() { 
         @Override 
         public void onErrorResponse(VolleyError error) { 
    
         } 
        }) { 
    
         @Override 
         protected Map<String, DataPart> getByteData() { 
          Map<String, DataPart> params = new HashMap<>(); 
          RandomAccessFile f = null; 
          try { 
           f = new RandomAccessFile(filePath, "r"); 
          } catch (FileNotFoundException e) { 
           e.printStackTrace(); 
           return null; 
          } 
    
          byte[] b; 
    
          try { 
           b = new byte[(int)f.length()]; 
           f.readFully(b); 
          } catch (IOException e) { 
           e.printStackTrace(); 
           return null; 
          } 
    
          params.put("image", new DataPart("image.jpg", b, "image/jpeg")); 
    
          return params; 
         } 
        }; 
    

    Hereこれを行うには、必要なクラスがあります。

  • 関連する問題