android - অ্যান্ড্রয়েডে ভোলি লাইব্রেরি ব্যবহার করে কীভাবে ফাইল আপলোড করবেন?



file http-post (1)

আমার কাছে ইতিমধ্যে অনুরোধের একটি সাব ক্লাস রয়েছে যা সার্ভারে http পোস্টের জন্য ব্যবহৃত হয়। সমস্যাটি হচ্ছে, আমি কীভাবে কোনও ফাইলের জন্য একটি পরামিতি যুক্ত করতে পারি সে সম্পর্কে আমার কোনও ধারণা নেই। সার্ভারে স্ট্রিং পোস্ট করা সহজ। তবে আমার আলাদা পরামিতি হিসাবে ফাইল যুক্ত করতে হবে। আমি এটা কিভাবে করবো?

public class AddNewPetRequest extends Request<JSONObject> {

    private Response.Listener<JSONObject> listener;

    public AddNewPetRequest(String url, Map<String, String> params,
                                Response.Listener<JSONObject> reponseListener, Response.ErrorListener errorListener) {
        super(Request.Method.GET, url, errorListener);
        this.listener = reponseListener;
        this.params = params;
    }

    public AddNewPetRequest(int method, String url, Map<String, String> params,
                                Response.Listener<JSONObject> reponseListener, Response.ErrorListener errorListener) {
        super(method, url, errorListener);
        this.listener = reponseListener;
        this.params = params;
    }

    protected Map<String, String> getParams()
            throws com.android.volley.AuthFailureError {
        return params;
    };

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers));
            return Response.success(new JSONObject(jsonString),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }

    @Override
    protected void deliverResponse(JSONObject response) {
        // TODO Auto-generated method stub
        listener.onResponse(response);
    }
}

আপডেট প্রশ্ন: আমি এখানে উত্তরগুলির একের ধরণটি স্ট্যাকওভারফ্লোতে অনুসরণ করি এবং আমি এই বাস্তবায়নটি নিয়ে এসেছি:

public class MultipartRequest extends Request<String> {

private MultipartEntity entity = new MultipartEntity();

private final Response.Listener<String> mListener;
private HashMap<String, String> mParams;


public MultipartRequest(String url, Response.ErrorListener errorListener, Response.Listener<String> listener)
{
    super(Method.POST, url, errorListener);
    mListener = listener;

    buildMultipartEntity();
}

private void buildMultipartEntity()
{
    entity.addPart("profile_picture", new FileBody(new File("/storage/emulated/0/Pictures/VSCOCam/2015-07-31 11.55.14 1.jpg")));
    try
    {
        entity.addPart("user_id", new StringBody("15"));
        entity.addPart("name", new StringBody("Bogs"));
        entity.addPart("gender", new StringBody("Male"));
        entity.addPart("date_birth", new StringBody("1999-12-5"));
        entity.addPart("breed", new StringBody("monkey"));
    }
    catch (UnsupportedEncodingException e)
    {
        VolleyLog.e("UnsupportedEncodingException");
    }
}

@Override
public String getBodyContentType()
{
    return entity.getContentType().getValue();
}

@Override
public byte[] getBody() throws AuthFailureError
{
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    try
    {
        entity.writeTo(bos);
    }
    catch (IOException e)
    {
        VolleyLog.e("IOException writing to ByteArrayOutputStream");
    }
    return bos.toByteArray();
}

@Override
protected Response<String> parseNetworkResponse(NetworkResponse response)
{
    return Response.success("Uploaded", getCacheEntry());
}

@Override
protected void deliverResponse(String response)
{
    mListener.onResponse(response);

}

আমি যখন এই অনুরোধটি আমার অনুরোধের সারিতে যুক্ত করব, এটি একটি com.android.volley.TimeoutError প্রতিক্রিয়া জানায় তবে যদি কোনও ডাটা বেজ পরীক্ষা করে, অনুরোধটি কার্যকর হয় এবং টেবিলে আইটেম যুক্ত করে তবে প্রোফাইল ছবি আপলোডটির আকার মাত্র 1 বাইট থাকে। আরেকটি সমস্যা, আমার ডাটাবেস আইটেমটি দু'বার যুক্ত হয়েছে।

সমস্যা সমাধান করা আমি এর অনুরোধের সময়টি সেট করে ইতিমধ্যে এটি ঠিক করেছি। যা ঘটেছিল তা হ'ল ভলির লাইব্রেরির ডিফল্ট সময়সীমার পরে আমি আমার সার্ভারের কাছ থেকে প্রতিক্রিয়া পেতে পারছি না তাই আমার অনুরোধের জন্য এই পদ্ধতিটি কল করে এবং সেট করে আমার টাইমআউটটি সেট করুন:

multipartRequest.setRetryPolicy(new DefaultRetryPolicy(1000 * 60, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

এই পদ্ধতি আপনাকে সাহায্য করতে পারে:

public int uploadFile(String sourceFileUri, String fileName)
{
    String upLoadServerUri = "your_api_url";

    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(sourceFileUri); 
    //errMsg=Environment.getExternalStorageDirectory().getAbsolutePath();
    if (!sourceFile.isFile())
    {
        Log.e("uploadFile", "Source File Does not exist");
        return 0;
    }
    try {
        // open a URL connection to the Servlet
        FileInputStream fileInputStream = new FileInputStream(sourceFile);
        URL url = new URL(upLoadServerUri);
        conn = (HttpURLConnection) url.openConnection(); // Open a HTTP  connection to  the URL
        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);
        //conn.setRequestProperty("pid", "4");
        dos = new DataOutputStream(conn.getOutputStream());

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

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

        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)
        {
            getActivity().runOnUiThread(new Runnable()
            {
                public void run() {
                    Toast.makeText(context, "Il y a une erreur l'hors du trasfert de l'image.", Toast.LENGTH_SHORT).show();
                }
            });  
        }

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

    } catch (MalformedURLException ex) {  
        // dialog.dismiss();  
        ex.printStackTrace();
        Toast.makeText(context, "MalformedURLException", Toast.LENGTH_SHORT).show();
        Log.e("Upload file to server", "error: " + ex.getMessage(), ex);  
    } catch (Exception e) {
        //  dialog.dismiss();  
        e.printStackTrace();
        Toast.makeText(context,errMsg+ "Exception : " + e.getMessage(), Toast.LENGTH_SHORT).show();
        Log.e("Upload file to server Exception", "Exception : " + e.getMessage(), e);  
    }
    //  dialog.dismiss();         
    return serverResponseCode;  
}





android-volley