Как я могу загрузить файл в Kloudless из моего android? - PullRequest
0 голосов
/ 30 января 2020

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

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

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

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 ]

1 голос
/ 30 января 2020

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

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

0 голосов
/ 10 февраля 2020

Наконец-то нашли простое решение для загрузки файла в 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);
   }

, просто преобразовав файл в двоичный массив и отправив его в теле

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...