Как я могу загрузить файл в Kloudless с моего Android-устройства?

Я хотел загрузить файл из своего внутреннего хранилища Android в любое облачное хранилище (например, Google Drive,One drive и т. Д.), Поскольку kloudless предоставляет api для загрузки файла в любое облачное хранилище с помощью accesstoken Я хотел использовать тот же API для загрузки файла ( https://api.kloudless.com/v1/accounts/accountid+/storage/files/).

Я попробовал через почтальона я могу загрузить файл

Теперь я попробовал через Android Volley, я могу создать файл в облаке, но внутри него нет данных. Вот мой код

public class MainActivity extends AppCompatActivity {
Button b;
TextView TV;
File myFile;
String responseString;
String path;
public String BASE_URL = "https://api.kloudless.com";
private static final int FILE_SELECT_CODE = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TV = findViewById(R.id.textView);
    b = findViewById(R.id.button);
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showFileChooser();
        }
    });
}

private void showFileChooser() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("*/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);

    try {
        startActivityForResult(
                Intent.createChooser(intent, "Select a File to Upload"),
                FILE_SELECT_CODE);
    } catch (android.content.ActivityNotFoundException ex) {
        // Potentially direct the user to the Market with a Dialog
        Toast.makeText(this, "Please install a File Manager.",
                Toast.LENGTH_SHORT).show();
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == FILE_SELECT_CODE) {
        if (resultCode == RESULT_OK) {
            // Get the Uri of the selected file
            Uri uri = data.getData();
            Log.d("TAG", "File Uri: " + uri.toString());
            // Get the path
            String path = null;
            try {
                path = FileUtils.getPath(this, uri);
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
            Log.d("TAG", "File Path: " + path);
            try {
                data();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}
public void data() throws FileNotFoundException, UnsupportedEncodingException {
    final String url = BASE_URL + "/v1/accounts/" + "accountid" + "/storage/files/";

    final RequestQueue queue = Volley.newRequestQueue(this);
    HashMap<String, Object> params = new HashMap<String, Object>();
    params.put( "file","somedata");

    JSONObject Body=new JSONObject(params);

    final JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url,Body, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            // response
            Log.d("Response", response.toString());
        }
    },
            new ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // error
                    Log.d("Error.Response", error.toString());
                }
            }) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            HashMap<String, String> params = new HashMap<String, String>();
            params.put("Authorization", "Bearer Bearerkey");
              params.put("Content-Type", "form-data");
            params.put("X-Kloudless-Metadata", "{\"parent_id\":\"root\",\"name\":\"testdone.txt\"}");
         //   params.put("Content-Length", Space);
            return params;
        }



    };
    queue.add(request);
}

Помогите, пожалуйста, как отправить файл в теле моего запроса

2 ответа

Решение

Наконец-то нашел простое решение для загрузки файла в api

 RequestQueue queue = Volley.newRequestQueue(this);
    String url = BASE_URL + "/v1/accounts/" + "353284419" + "/storage/files/";
    StringRequest postRequest = new StringRequest(Request.Method.POST, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Toast.makeText(MainActivity.this, response, Toast.LENGTH_LONG).show();
                    // response
                    Log.d("Response", response);
                }
            },
            new ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // error
                    Log.d("Error.Response", error.toString());
                }
            }
    ) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("Authorization", "Bearer ix7wW4CFJsHxhttg42qsO6HNNRPh06");
            params.put("Content-Type", "application/octet-stream");
            params.put("X-Kloudless-Metadata", "{\"parent_id\":\"root\",\"name\":\"testing uplodes.pdf\"}");
            //      params.put("Content-Length", Space);
            return params;
        }

        @Override
        public byte[] getBody() throws com.android.volley.AuthFailureError {
            File f=new File(path);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            FileInputStream fis = null;
            try {
                fis = new FileInputStream(f);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            byte[] bytesArray = new byte[(int)f.length()];
            try {
                fis.read(bytesArray);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return bytesArray;
        };

    };
    postRequest.setRetryPolicy(new DefaultRetryPolicy(
            40000,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    queue.add(postRequest);
   }

просто конвертируем файл в двоичный массив и отправляем в теле

Я работаю в Kloudless, и хотя я не очень хорошо знаком с Android Volley, проблема здесь, похоже, в том, что вы устанавливаете тело JSON с неправильным типом содержимого. Чтобы воспроизвести запрос Postman, вам нужно вместо этого использовать загрузку файлов из нескольких частей, как описано здесь: Как загрузить файл с помощью библиотеки Volley в Android? Файл необходимо добавить в поле с именемfile, например entity.addPart("file", new FileBody(new File("....")));

Для более эффективной обработки на стороне сервера (для файлов большего размера) выполняемый запрос должен вместо этого включать содержимое двоичного файла в тело запроса и иметь заголовок Content-Type: application/octet-stream. Судя по беглому поиску, кажется, что с библиотекой Volley все не так просто, поэтому лучше попробовать другую библиотеку.

Другие вопросы по тегам