如何从我的 android 上传文件到 Kloudless?

How can i upload a file to Kloudless from my android?

我想将文件从我的 android 内部存储上传到任何云存储(ex.google 驱动器,一个驱动器等),因为 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);
}

请帮助我如何发送请求正文中的文件

我在 Kloudless 工作,虽然我对 Android Volley 不是很熟悉,这里的问题似乎是您设置的 JSON body 内容不正确类型。为了复制 Postman 请求,您需要改用分段文件上传,如下所述:How to upload file using Volley library in android? 需要将文件添加到名为 file 的字段中,例如 entity.addPart("file", new FileBody(new File("....")));

为了在服务器端进行更有效的处理(对于较大的文件),执行的请求应该改为在请求中包含二进制文件内容 body 并具有 header Content-Type: application/octet-stream。根据一些粗略的搜索,Volley 库似乎并不那么容易,因此最好尝试不同的库。

终于找到了将文件上传到 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);
   }

只需将文件转换为二进制数组并在正文中发送