Android 使用改型/OkHttp时,如何将多部分实体写入文件?
我正在更新最初使用ApacheHTTP客户端构建的代码,以改用改型。我遇到问题的代码块将本地应用程序数据库的副本上载到我的服务器。这个过程的一部分是使用md5来描述在认证后发送的内容。它首先创建多部分实体,然后将其写入一个新文件,以便在该文件上创建md5Android 使用改型/OkHttp时,如何将多部分实体写入文件?,android,retrofit,okhttp,retrofit2,okhttp3,Android,Retrofit,Okhttp,Retrofit2,Okhttp3,我正在更新最初使用ApacheHTTP客户端构建的代码,以改用改型。我遇到问题的代码块将本地应用程序数据库的副本上载到我的服务器。这个过程的一部分是使用md5来描述在认证后发送的内容。它首先创建多部分实体,然后将其写入一个新文件,以便在该文件上创建md5 public class MyRestClient extends AsyncHttpClient { public void sendBackup(String secretKey, String accessId, AsyncHttpR
public class MyRestClient extends AsyncHttpClient {
public void sendBackup(String secretKey, String accessId, AsyncHttpResponseHandler responseHandler){
File file = new File(FileUtil.DATBASE_DIRECTORY_PATH + File.separator + FileUtil.DATABASE_FILE_NAME + ".db");
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, boundary, Charset.forName("UTF-8"));
FileBody fileBody = new FileBody(file);
entity.addPart("device_backup[database_dump]", fileBody);
//creating this dummy file is crucial because for the server to authorize this file the
//server takes the md5 of the raw_post of the request and compares it to the md5 in the header
//this dummy file is mimicking the request.raw_post that is done on the server
File dummyFile = new File(FileUtil.DATBASE_DIRECTORY_PATH + File.separator + "dummy.db");
try {
if (!dummyFile.exists()) {
dummyFile.createNewFile();
}
FileOutputStream fileOutputStream = new FileOutputStream(dummyFile);
entity.writeTo(fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
setAuth(DEVICE_BACKUP_EXTENSION, dummyFile, secretKey, accessId);
super.post(MyApplication.getContext(), DEVICE_BACKUP_URL, entity, MultipartContentType, responseHandler);
}
}
到目前为止,我所拥有的:
public void backupCurrentDatabase(final Long backupId) {
public static String boundary = "*****";
public static final String MultipartContentType = "multipart/form-data;boundary=" +
boundary + "; charset=UTF-8";
SharedPreferences prefs = getActivity().getSharedPreferences(Const.SHARE_PREF_NAME, Context.MODE_PRIVATE);
String accessId = prefs.getString(Const.ACCESS_ID_PREF_KEY, null);
String secretKey = prefs.getString(Const.SECRET_KEY_PREF_KEY, null);
File file = new File(FileUtil.DATBASE_DIRECTORY_PATH + File.separator + FileUtil.DATABASE_FILE_NAME + ".db");
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("device_backup[database_dump]", FileUtil.DATABASE_FILE_NAME + ".db",
RequestBody.create(MediaType.parse(MultipartContentType), file))
.build();
File dummyFile = new File(FileUtil.DATBASE_DIRECTORY_PATH + File.separator + "dummy.db");
try {
if (!dummyFile.exists()) {
dummyFile.createNewFile();
}
FileOutputStream fileOutputStream = new FileOutputStream(dummyFile);
//Write requestBody to dummyFile
fileOutputStream.flush();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
SyncApi client = ServiceGenerator.createService(SyncApi.class, ServiceGenerator.DEVICE_BACKUP_EXTENSION,
dummyFile, secretKey, accessId);
Call<SendBackup> call = client.sendBackup(requestBody);
}
public void backupCurrentDatabase(最终长备份ID){
公共静态字符串边界=“*******”;
公共静态最终字符串MultipartContentType=“multipart/form data;boundary=“+
边界+“字符集=UTF-8”;
SharedReferences prefs=getActivity().GetSharedReferences(Const.SHARE\u PREF\u NAME,Context.MODE\u PRIVATE);
String accessId=prefs.getString(Const.ACCESS\u ID\u PREF\u KEY,null);
String secretKey=prefs.getString(Const.SECRET\u KEY\u PREF\u KEY,null);
File File=新文件(FileUtil.DATBASE_目录_路径+File.separator+FileUtil.DATABASE_文件_名称+“.db”);
RequestBody RequestBody=新的MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart(“设备备份[数据库转储]”,FileUtil.database\u文件名+“.db”,
create(MediaType.parse(MultipartContentType),file))
.build();
File dummyFile=新文件(FileUtil.DATBASE_目录_路径+File.separator+“dummy.db”);
试一试{
如果(!dummyFile.exists()){
dummyFile.createNewFile();
}
FileOutputStream FileOutputStream=新的FileOutputStream(dummyFile);
//将requestBody写入dummy文件
fileOutputStream.flush();
fileOutputStream.close();
}捕获(IOE异常){
e、 printStackTrace();
}
SyncApi client=ServiceGenerator.createService(SyncApi.class、ServiceGenerator.DEVICE\u BACKUP\u扩展、,
dummyFile、secretKey、accessId);
Call Call=client.sendBackup(requestBody);
}
因此,我获取相同的信息,并创建一个可以通过改造传递的RequestBody。看起来这应该是我写在Dummy文件中的内容。接下来是将多部分写入dummyFile的相同代码,只是它缺少了实际写入fileOutputStream的重要部分,因为我不知道要使用什么函数。接下来,设置改装实例并将所有身份验证信息传递给我的服务生成器。最后打一个电话并将requestBody传递给改装。(未显示call.enqueue()内容)
我错过了什么使这项工作?RequestBody是否是正确的使用对象?/**
/**
* Upload picture API method.
* This upload picture feature is only for demo purpose.
*/
public void UploadPictureToServer()
{
if (file != null)
{
final APIParameters parameters = new APIParameters(MainActivity.this,true,false);
Call<ResponseBody> call = parameters.GetUploadImageParameters(file);
if (call == null)
{
return;
}
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
parameters.DismissLoader();
GetUploadImageData(response);
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
parameters.DismissLoader();
t.printStackTrace();
}
});
}
}
/**
* Get Upload image response for parsing data
* @param response
*/
private void GetUploadImageData(Response<ResponseBody> response)
{
String MyResult = null;
try
{
MyResult = CM.GetAPIResponseStatus(response.body().string(),MainActivity.this);
}
catch (IOException e)
{
e.printStackTrace();
}
if (MyResult == null)
{
return;
}
ArrayList<Model_Category> model_categoryArrayList = JSONHelper.parseUploadImageResponse(MyResult);
if (model_categoryArrayList != null)
{
/* try
{
CacheMemory.writeObject(MainActivity.this, "category.txt", model_categoryArrayList);
}
catch (IOException e)
{
e.printStackTrace();
}*/
for (int i=0;i<model_categoryArrayList.size();i++)
{
Log.e("Category :-->","Id : "+model_categoryArrayList.get(i).id+" Name : "+model_categoryArrayList.get(i).categoryName);
}
}
}
*上传图片的API方法。
*此上传图片功能仅用于演示目的。
*/
public void UploadPictureToServer()
{
如果(文件!=null)
{
最终APIParameters参数=新APIParameters(MainActivity.this,true,false);
Call Call=parameters.GetUploadImageParameters(文件);
if(call==null)
{
返回;
}
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
parameters.DismissLoader();
GetUploadImageData(响应);
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
parameters.DismissLoader();
t、 printStackTrace();
}
});
}
}
/**
*获取用于解析数据的上载图像响应
*@param响应
*/
私有void GetUploadImageData(响应)
{
字符串MyResult=null;
尝试
{
MyResult=CM.getapirestatus(response.body().string(),MainActivity.this);
}
捕获(IOE异常)
{
e、 printStackTrace();
}
if(MyResult==null)
{
返回;
}
ArrayList model_categoryArrayList=JSONHelper.parseUploadImageResponse(MyResult);
if(model_categoryArrayList!=null)
{
/*试一试
{
CacheMemory.writeObject(MainActivity.this,“category.txt”,model_categoryArrayList);
}
捕获(IOE异常)
{
e、 printStackTrace();
}*/
对于(int i=0;i
/**
* If you do not need any type-specific response, you can specify return value as simply Call<ResponseBody>.
* @param image
* @param //name
* @return
*/
@Multipart
@POST(URLS.WEB_ADD_CATEGORY)
Call<ResponseBody> postImage(@Query(WebServicesTags.TAG_STR_APIKEY) String apiKey,@Part MultipartBody.Part image,@Part("userId") RequestBody userId,@Part("categoryName") RequestBody categoryName,@Part("deviceType") RequestBody deviceType,@Part("deviceToken") RequestBody deviceToken,@Part("accessToken") RequestBody accessToken,@Part("intUdId") RequestBody intUdId);