安卓设备上,把小文件转成字串发送出去

本文探讨了在安卓设备上如何将小文件读取为String,通过指定StandardCharsets.ISO_8859_1编码发送到服务端,并在服务端正确接收和存储的过程,特别关注了字符编码一致性对于文件大小限制的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在安卓设备上,把小文件读出来,转成string,作为查询参数发送出去,在接收端把文件保存下来

服务端也是在安卓上,通过 androidasync 搭建的本地服务端,

发送端代码如下:

 private void sendZipFunc() {

        BufferedInputStream bis = null;
        ByteArrayOutputStream baos = null;

        File sd = Environment.getExternalStorageDirectory();
        boolean can_write = sd.canWrite();
        Log.d(TAG,"can_write>>>"+can_write);

        try {

            if (!new File(srcPath).exists()){
                Toast.makeText(this,"文件不存在!",Toast.LENGTH_SHORT).show();
                return;
            }

            bis = new BufferedInputStream(new FileInputStream(srcPath));
            baos = new ByteArrayOutputStream();

            byte[] buffer = new byte[1024];
            int len = -1;
            while ((len = bis.read(buffer))!=-1){
                baos.write(buffer, 0, len);
            }

            WeakHashMap<String, Object> params = new WeakHashMap<>();
            params.put("zipName", "2022-02-17122");
            params.put("zipFile", new String(baos.toByteArray(), StandardCharsets.ISO_8859_1));
            MyRequest.getInstance().sendPic(params, new RetrofitCallBack<BaseResponse>() {
                @Override
                public void onBegin() {
                    Log.d(TAG, "onBegin >>>");
                }

                @Override
                public void onSuccess(BaseResponse result) {
                    Log.d(TAG, "onSuccess >>>");
                }

                @Override
                public void onError(ApiException error) {
                    Log.d(TAG, "onError >>> ");
                }

                @Override
                public void onFinish() {
                    Log.d(TAG, "onFinish >>>");
                }
            });

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (null != baos) {
                    baos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                if (null != bis) {
                    bis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

接收端:

在模块的build.gradle的 

dependencies {
    implementation 'com.koushikdutta.async:androidasync:2.+'
}
public static final int ListernPort = 6666; 
void getFunc() {
//以下是解决从客户端发送过来的中文乱码的
        try {
            Class<Charsets> charsetsClass = Charsets.class;
            Field us_ascii = charsetsClass.getDeclaredField("US_ASCII");
            us_ascii.setAccessible(true);
            us_ascii.set(Charsets.class, Charsets.UTF_8);
        } catch (Exception e) {
            e.printStackTrace();
        }


        AsyncHttpServer server = new AsyncHttpServer();

 server.post("/webs/receiveimg", new HttpServerRequestCallback() {
            @Override
            public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) {

                String zipName = request.getQuery().getString("zipName");
                String zipFile = request.getQuery().getString("zipFile");

                BufferedOutputStream bos = null;
                ByteArrayInputStream bais = null;
                try {
                    bos = new BufferedOutputStream(new FileOutputStream(receivePath));

                    byte[] str = zipFile.getBytes(StandardCharsets.ISO_8859_1);

                    bos.write(str, 0, str.length);

                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (null != bais) {
                            bais.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    if (null != bos) {
                        try {
                            bos.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }

                Log.d(TAG, "zipName=" + zipName);

//                response.send("{status:'success',msg:'receiveimg'}");
            }
        });

    server.listen(ListernPort);
}

客户端和服务端指定的String编码都为StandardCharsets.ISO_8859_1,存储的文件就没有问题,不指定的话,接收到的文件大小就不对了。

PS:这种方式发送的文件大小有限制,只能是很小的文件,我测试不超过1M的,可以发送成功,大文件 发送不成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值