在安卓设备上,把小文件读出来,转成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的,可以发送成功,大文件 发送不成功。