在Android中打开图像并将其设置为文件,然后以Json格式发送

在Android中打开图像并将其设置为文件,然后以Json格式发送,android,json,file,imageview,android-volley,Android,Json,File,Imageview,Android Volley,好的,我正在尝试打开一个图像,在imageview中设置它,并将其设置为一个文件,以便使用volley以多部分形式请求发送它,现在我正在使用PostMan向我的服务器发出Http请求(字符串和文件),它工作正常,但我无法在android中实现。到目前为止,我所拥有的就是这个 public void onClick(View v) { if(v == banner){ Intent intent = new Intent(); //Verified the

好的,我正在尝试打开一个图像,在imageview中设置它,并将其设置为一个文件,以便使用volley以多部分形式请求发送它,现在我正在使用PostMan向我的服务器发出Http请求(字符串和文件),它工作正常,但我无法在android中实现。到目前为止,我所拥有的就是这个

public void onClick(View v) {
    if(v == banner){
        Intent intent = new Intent();
        //Verified the android version
        if(Build.VERSION.SDK_INT < 19){

            intent.setAction(Intent.ACTION_GET_CONTENT);
        } else{
            //KitKat 4.4 o superior
            intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
            intent.addCategory(Intent.CATEGORY_OPENABLE);
        }
        intent.setType("image/*");
        startActivityForResult(intent, request_code);
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == Activity.RESULT_OK && requestCode == request_code) {
        uri = data.getData();
        banner.setImageURI(uri);
        //TAG for store the Uri to the selected file
        banner.setTag(uri);
        path = uri.getPath();
        fileImage = new File (path);
        Toast.makeText(this,path,Toast.LENGTH_LONG).show();}
public void onClick(视图v){
如果(v==横幅){
意图=新意图();
//验证了android版本
如果(Build.VERSION.SDK_INT<19){
intent.setAction(intent.ACTION\u GET\u CONTENT);
}否则{
//KitKat 4.4 o高级
意向=新意向(意向.行动\打开\文件);
intent.addCategory(intent.CATEGORY\u可打开);
}
intent.setType(“image/*”);
startActivityForResult(意图、请求代码);
}
}
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
if(resultCode==Activity.RESULT\u确定&&requestCode==request\u代码){
uri=data.getData();
banner.setImageURI(uri);
//用于将Uri存储到选定文件的标记
banner.setTag(uri);
path=uri.getPath();
fileImage=新文件(路径);
Toast.makeText(this,path,Toast.LENGTH_LONG).show();}
其中banner是我的imageview,fileImage是我的文件

MultipartRequest myRequest = new MultipartRequest(
            "MY_URL",
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.e("error");
                }
            },
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    VolleyLog.e(response);
                }
            },
            fileImage,
            params
    );
MultipartRequest myRequest=新的MultipartRequest(
“我的URL”,
新的Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
截击记录(“错误”);
}
},
新的Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
截击记录e(应答);
}
},
文件映像,
params
);
我正在使用另一个问题中回答的这个类

public class MultipartRequest extends Request<String> {

//private MultipartEntity entity = new MultipartEntity();

MultipartEntityBuilder entity = MultipartEntityBuilder.create();
HttpEntity httpentity;
private static final String FILE_PART_NAME = "banner";

private final Response.Listener<String> mListener;
private final File mFilePart;
private final Map<String, String> mStringPart;

public MultipartRequest(String url, Response.ErrorListener errorListener,
                        Response.Listener<String> listener,
                        File file,
                        Map<String, String> mStringPart) {
    super(Method.POST, url, errorListener);

    mListener = listener;
    mFilePart = file;
    this.mStringPart = mStringPart;
    entity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    buildMultipartEntity();
}

public void addStringBody(String param, String value) {
    mStringPart.put(param, value);
}

private void buildMultipartEntity() {
    entity.addPart(FILE_PART_NAME, new FileBody(mFilePart));
    for (Map.Entry<String, String> entry : mStringPart.entrySet()) {
        entity.addTextBody(entry.getKey(), entry.getValue());
    }
}

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

@Override
public byte[] getBody() throws AuthFailureError {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    try {
        httpentity = entity.build();
        httpentity.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);
}
public类MultipartRequest扩展请求{
//私有多方实体=新多方实体();
MultipartEntityBuilder实体=MultipartEntityBuilder.create();
HttpEntity HttpEntity;
私有静态最终字符串文件\u PART\u NAME=“banner”;
私人最终回应。监听器;
私有最终文件mFilePart;
私人最终地图mStringPart;
公共多部分请求(字符串url,Response.ErrorListener ErrorListener,
回应,听众,
文件文件,
地图(mStringPart){
super(Method.POST、url、errorListener);
mListener=监听器;
mFilePart=文件;
this.mStringPart=mStringPart;
entity.setMode(HttpMultipartMode.BROWSER_兼容);
buildMultipartEntity();
}
public void addStringBody(字符串参数,字符串值){
mStringPart.put(参数,值);
}
私有void buildMultipartEntity(){
entity.addPart(文件名,新文件体(mFilePart));
对于(Map.Entry:mStringPart.entrySet()){
entity.addTextBody(entry.getKey(),entry.getValue());
}
}
@凌驾
公共字符串getBodyContentType(){
返回httpentity.getContentType().getValue();
}
@凌驾
公共字节[]getBody()抛出AuthFailureError{
ByteArrayOutputStream bos=新建ByteArrayOutputStream();
试一试{
httpentity=entity.build();
httpentity.writeTo(bos);
}捕获(IOE异常){
e(“向ByteArrayOutputStream写入IOException”);
}
返回bos.toByteArray();
}
@凌驾
受保护的响应parseNetworkResponse(NetworkResponse响应){
返回Response.success(“上传”,getCacheEntry());
}
@凌驾
受保护的void deliverResponse(字符串响应){
mListener.onResponse(response);
}
}


但它返回错误“IOException写入ByteArrayOutputStream”

如果您的目标只是将图像保存到文件中,请看这篇文章,您需要先将接收到的图像转换为位图,然后按照文章中的内容进行操作

我正在使用该类的可能副本,但我的问题是,一旦我打开图像,如何使其成为文件实际上我不知道我正在尝试做什么,我知道现在,我需要打开一个图像,并将其作为一个文件以MultipartFormRequest的形式发送。不,我不想将图像存储在我的设备中