Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用Reformation2将照片上载到服务器_Android_Performance_Http_Upload_Retrofit - Fatal编程技术网

Android 如何使用Reformation2将照片上载到服务器

Android 如何使用Reformation2将照片上载到服务器,android,performance,http,upload,retrofit,Android,Performance,Http,Upload,Retrofit,是否有人知道使用改型2将图像上传到服务器的方法。大多数在线解决方案都使用改装1 谢谢 我试过这个: @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //GALLERY if ((isGalleryCalled(requestCode) && resultCode == RESULT_OK)) { Log.w(TAG,

是否有人知道使用改型2将图像上传到服务器的方法。大多数在线解决方案都使用改装1

谢谢 我试过这个:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    //GALLERY
    if ((isGalleryCalled(requestCode) && resultCode == RESULT_OK)) {
        Log.w(TAG, "onActivityResult > isGalleryCalled > data.getData(): " + data.getData());
        Uri originalUri = data.getData();
        if (originalUri != null) {
            mImageUri = originalUri;
        }
    }
    //CAPTURE
    else if ((isCaptureCalled(requestCode)) && resultCode == RESULT_OK) {
        Log.w(TAG, "onActivityResult > isCaptureCalled > data.getData(): " + data.getData());
        Uri originalUri = data.getData();
        if (originalUri != null) {
            mImageUri = originalUri;

        }
    }



private void prepareImage(String mImageUri ) {

    File file = new File(mImageUri );

    mRequestBodyImage =  RequestBody.create(MediaType.parse("multipart/form-data"), file);

    isUploadImage = true;
    Log.d(TAG, "isUploadImage: " + isUploadImage + " | \nuri: " + uri + " | \nfile getPath: " + file.getPath());

}//end sendReport




    Call<DefaultResponse> call = RestClient.get().uploadImage(file);

....


    @Multipart
    @POST(Constant.API_UPLOADIMAGE)
    Call<DefaultResponse> uploadImage(
            //Upload File
            @Part("myfile\"; filename=\"image.png\" ") RequestBody file
    ); 
@覆盖
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
//画廊
if((isGalleryCalled(requestCode)&&resultCode==RESULT_OK)){
Log.w(标记“onActivityResult>isGalleryCalled>data.getData():”+data.getData());
Uri originalUri=data.getData();
if(originalUri!=null){
Mimageri=原发性;
}
}
//俘获
else if((isCaptureCall(requestCode))&&resultCode==RESULT\u OK){
Log.w(标记“onActivityResult>isCaptureCalled>data.getData():”+data.getData());
Uri originalUri=data.getData();
if(originalUri!=null){
Mimageri=原发性;
}
}
私有void prepareImage(字符串mimageri){
File File=新文件(mimageri);
mRequestBodyImage=RequestBody.create(MediaType.parse(“多部分/表单数据”),文件);
isUploadImage=true;
Log.d(标记“isUploadImage:+isUploadImage+”|\nuri:+uri+“|\n文件getPath:+file.getPath());
}//结束报告
Call Call=RestClient.get().uploadImage(文件);
....
@多部分
@POST(常量.API\u上传图像)
调用上载映像(
//上传文件
@部分(“myfile\”文件名=\“image.png\”)请求主体文件
); 
我收到这些错误:

sendErrorReport - file: com.squareup.okhttp.RequestBody$3@2f83a2f9
stat failed: ENOENT (No such file or directory) : content:/media/external/images/media/2720
java.io.FileNotFoundException: content:/media/external/images/media/2720: open failed: ENOENT (No such file or directory)
at libcore.io.IoBridge.open(IoBridge.java:456)
at java.io.FileInputStream.<init>(FileInputStream.java:76)
at okio.Okio.source(Okio.java:163)
at com.squareup.okhttp.RequestBody$3.writeTo(RequestBody.java:117)
at com.squareup.okhttp.MultipartBuilder$MultipartRequestBody.writeOrCountBytes(MultipartBuilder.java:277)
at com.squareup.okhttp.MultipartBuilder$MultipartRequestBody.writeTo(MultipartBuilder.java:297)
sendErrorReport-文件:com.squareup.okhttp.RequestBody$3@2f83a2f9
stat失败:enoint(没有这样的文件或目录):content:/media/external/images/media/2720
java.io.FileNotFoundException:content:/media/external/images/media/2720:打开失败:enoint(没有这样的文件或目录)
在libcore.io.IoBridge.open中(IoBridge.java:456)
位于java.io.FileInputStream。(FileInputStream.java:76)
位于okio.okio.source(okio.java:163)
位于com.squareup.okhttp.RequestBody$3.writeTo(RequestBody.java:117)
位于com.squareup.okhttp.MultipartBuilder$MultipartRequestBody.writeOrCountBytes(MultipartBuilder.java:277)
位于com.squareup.okhttp.MultipartBuilder$MultipartRequestBody.writeTo(MultipartBuilder.java:297)
[更新]

更新@Anton Shkurenko反馈的代码

图像路径开始处理

UtilApiHelp.getPath:/storage/simulated/0/DCIM/Camera/20151210_124246.jpg

private void prepareImage(String uri) {


    File file = new File(uri);

    mRequestBodyImage =  RequestBody.create(MediaType.parse("multipart/form-data"), file);

    isUploadImage = true;
    Log.d(TAG, "prepareImage isUploadImage: " + isUploadImage + " | \nuri: " + uri + " | \nfile getPath: " + file.getPath());


    sendErrorReport("", mRequestBodyImage);// test1
uploadImage(file.getPath());//test 2
}//end sendReport



//API Send Image test 1 - FAILED
private void sendErrorReport(String s, String msg, RequestBody file){

    Log.e(TAG, "sendErrorReport - file: " + file.toString());

    String user_id = Preferences.getInstance().getUserId();

    Call<DefaultResponse> call = RestClient.get().sendErrorReport(s, file);
    call.enqueue(new Callback<DefaultResponse>() {
        @Override
        public void onResponse(Response<DefaultResponse> response, Retrofit retrofit) {

            Log.w("sendErrorLog > onResponse => ", String.valueOf(response.isSuccess()));

        }

        @Override
        public void onFailure(Throwable t) {
            t.printStackTrace();
        }
    });
}
private void prepareImage(字符串uri){
文件=新文件(uri);
mRequestBodyImage=RequestBody.create(MediaType.parse(“多部分/表单数据”),文件);
isUploadImage=true;
Log.d(标记“prepareImage isUploadImage:+isUploadImage+”|\nuri:+uri+“|\nfile getPath:+file.getPath());
sendErrorReport(“,mRequestBodyImage);//test1
上载映像(file.getPath());//测试2
}//结束报告
//API发送映像测试1-失败
私有void sendErrorReport(字符串s、字符串msg、RequestBody文件){
Log.e(标记“sendErrorReport-file:+file.toString());
字符串user_id=Preferences.getInstance().getUserId();
Call Call=RestClient.get().sendErrorReport(s,文件);
call.enqueue(新回调(){
@凌驾
公共响应(响应、改装){
Log.w(“sendErrorLog>onResponse=>”,String.valueOf(response.issucess());
}
@凌驾
失效时的公共无效(可丢弃的t){
t、 printStackTrace();
}
});
}
错误:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:应为BEGIN_对象,但在第3行第2列路径处为字符串$

//上传测试2->不工作
私有void上载映像(最终字符串路径){
最后的身体照片=
UtilApiHelp.getImageBodyBuilder(新的HashMap(){{
放置(“图像”,路径);
}})
//.addFormDataPart(“在这里您可以添加另一个表单数据”,另一个表单数据)
.build();
Call Call=RestClient.get().sendErrorReport(照片);
call.enqueue(新回调(){
@凌驾
公共响应(响应、改装){
}
@凌驾
失效时的公共无效(可丢弃的t){
t、 printStackTrace();
}
});
}
错误:原因:java.lang.IllegalArgumentException:@Body参数不能与表单或多部分编码一起使用。(参数#1)用于方法APIService.sendErrorReport

用过这个电话吗

@FormUrlEncoded
@POST(Constant.API_POST_error_log)
Call<DefaultResponse> sendErrorReport(@Body RequestBody multipartBody);
@FormUrlEncoded
@POST(常量.API\u POST\u错误\u日志)
调用sendErrorReport(@Body RequestBody multipartBody);

[更新]
由于您更新了问题。您只是无法从给定的Uri中找到文件。请使用我的代码中的util函数
getPath
,以获取图像路径,希望这能起作用

[旧解决方案]
我有一个有效的解决方案:

Util函数:

public static RequestBody getImageBody(Map<String, String> map) {
  return getImageBodyBuilder(map).build();
}

public static MultipartBuilder getImageBodyBuilder(Map<String, String> map) {

  MultipartBuilder builder = new MultipartBuilder().type(MultipartBuilder.FORM);
  for (String key : map.keySet()) {
    final String filePlace = map.get(key);
    Log.d(TAG, "File place: " + filePlace);
    final String[] args = filePlace.split("\\.");
    final String fileExt = args[args.length - 1];
    Log.d(TAG, "File extension: " + fileExt);

    // Old solution, porting from one project to another
    // It's about problems with jpeg
    builder.addPart(Headers.of("Content-Disposition",
        "form-data; name=\"" + key + "\"; filename=\"" + filePlace + "\""), RequestBody.create(
        MediaType.parse("image/" + fileExt.toLowerCase().replace("jpg", "jpeg")),
        new File(map.get(key))));
  }

  return builder;
}

public static String getPath(Context ctx, Uri uri) {
  String[] projection = { MediaStore.Images.Media.DATA };
  Cursor cursor = ctx.getContentResolver().query(uri, projection, null, null, null);
  if (cursor == null) return null;
  int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
  cursor.moveToFirst();
  String s = cursor.getString(columnIndex);
  cursor.close();
  return s;
}
publicstaticrequestbody getImageBody(映射){
返回getImageBodyBuilder(map.build();
}
公共静态多部件生成器getImageBodyBuilder(地图){
MultipartBuilder=new MultipartBuilder().type(MultipartBuilder.FORM);
for(字符串键:map.keySet()){
最后一个字符串filePlace=map.get(key);
Log.d(标记“文件位置:”+filePlace);
最后一个字符串[]args=filePlace.split(“\\”);
最终字符串fileExt=args[args.length-1];
Log.d(标记“文件扩展名:”+fileExt);
//旧的解决方案,从一个项目移植到另一个项目
//这是关于jpeg的问题
builder.addPart(Headers.of(“内容处置”),
“表单数据;名称=\”“+key+”\“文件名=\”“+filePlace+”\”),RequestBody.create(
parse(“image/”+fileExt.toLowerCase().replace(“jpg”,“jpeg”)),
新文件(map.get(key));
}
返回生成器;
}
公共静态字符串getPath(上下文ctx,Uri){
字符串[]投影={MediaStore.Images.Media.DATA};
Cursor=ctx.getContentR
public static RequestBody getImageBody(Map<String, String> map) {
  return getImageBodyBuilder(map).build();
}

public static MultipartBuilder getImageBodyBuilder(Map<String, String> map) {

  MultipartBuilder builder = new MultipartBuilder().type(MultipartBuilder.FORM);
  for (String key : map.keySet()) {
    final String filePlace = map.get(key);
    Log.d(TAG, "File place: " + filePlace);
    final String[] args = filePlace.split("\\.");
    final String fileExt = args[args.length - 1];
    Log.d(TAG, "File extension: " + fileExt);

    // Old solution, porting from one project to another
    // It's about problems with jpeg
    builder.addPart(Headers.of("Content-Disposition",
        "form-data; name=\"" + key + "\"; filename=\"" + filePlace + "\""), RequestBody.create(
        MediaType.parse("image/" + fileExt.toLowerCase().replace("jpg", "jpeg")),
        new File(map.get(key))));
  }

  return builder;
}

public static String getPath(Context ctx, Uri uri) {
  String[] projection = { MediaStore.Images.Media.DATA };
  Cursor cursor = ctx.getContentResolver().query(uri, projection, null, null, null);
  if (cursor == null) return null;
  int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
  cursor.moveToFirst();
  String s = cursor.getString(columnIndex);
  cursor.close();
  return s;
}
final RequestBody photo =
    ImageUploadUtils.getImageBodyBuilder(new HashMap<String, String>() {{
                put("photo", imagePathWhateverYouWant);
              }})
              .addFormDataPart("here_you_can_add_another_form_data", anotherFormData).build();

 mApiService.attachPhoto("Token " + getToken(), photo);
// I user here RxJava, but I think it's easy to use Calls here.
@POST("deliveries/photos") Observable<Map<String, String>> attachPhoto(
     @Header("Authorization") String token, 
     @Body RequestBody multipartBody);