Android相机图像未上传到服务器。使用Multipart数据Http发布

扑打

我正在尝试使用齐射使用多部分数据http post从照相机和图库上载图像,但从照相机拍摄的图像未上载,而从画廊上载了图像。

 private void startCamera() {

    Intent imageIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
    imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
    // start the image capture Intent
    startActivityForResult(imageIntent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);

 }
 @Override
 public void onActivityResult(int requestCode, int resultCode, Intent data)
 {
    switch (requestCode) {

        case CAMERA_CAPTURE_IMAGE_REQUEST_CODE:
            if(resultCode== Activity.RESULT_OK){
                previewCapturedImage();
            }else{
                Toast.makeText(getActivity(),"User cancelled image capture",   Toast.LENGTH_SHORT).show();
            }
            break;
 }

 private void previewCapturedImage() {
    try {
        // bimatp factory
        BitmapFactory.Options options = new BitmapFactory.Options();
        // downsizing image as it throws OutOfMemory Exception for larger
        // images
        options.inSampleSize = 8;
        Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(),
                options);
        filePath=fileUri.getPath();
        Matrix matrix = new Matrix();
        matrix.postRotate(90);

        Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, options.outWidth, options.outHeight, matrix, true);

        postImageView.setImageBitmap(rotatedBitmap);
        ((TextView)appView.findViewById(R.id.deleteBtn)).setVisibility(View.VISIBLE);

    } catch (NullPointerException e) {
        e.printStackTrace();
    }
}

public  void postFeed(String commentString){
    RequestQueue mqueue = Volley.newRequestQueue(getActivity());
    Map<String, String> params = new HashMap<String, String>();
    params.put("text",commentString);
    params.put("user_id",SettingsHelper.getInstance(getActivity()).getPreference("id"));
    TSUServerRequest.postFeed(getActivity(),mqueue,params,new File(filePath),new Response.Listener<String>() {
        @Override
        public void onResponse(String s) {
            Log.d("a","bscljk");
            filePath="";
            fileUri= null;
            //Toast.makeText(getActivity(),"Success",Toast.LENGTH_LONG).show();
        }
    },new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            volleyError.printStackTrace();

        }
    });


  public static void postFeed(Context context,RequestQueue queue,Map<String, String> params,File file,
                            Listener<String> listener, ErrorListener errorListener){
    if (TSUServerRequest.checkForConnection(context)) {
        String url =API_CREATE_POST;
        MultiPartRequest myReq = new MultiPartRequest(url,errorListener,listener,file,params);
        queue.add(myReq);
        queue.start();
    }else{
        Toast.makeText(context, "No Internet!Please try again!", Toast.LENGTH_LONG).show();
    }
}

////MultipartRequest.java

public class MultiPartRequest extends Request<String> {

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

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 File compress(){

    File file = new File(filePath);

    try {
        Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath());
        if(flagCamera==1) {
            flagCamera=0;
            compressedFile = new File(Environment.getExternalStorageDirectory().toString() + "/compressed" + file.getName());
            FileOutputStream out = new FileOutputStream(compressedFile);
            bitmap.compress(Bitmap.CompressFormat.JPEG,70,out);
            out.flush();
            out.close();
        }else{
            return file;
        }
    } catch (FileNotFoundException e1) {
        e1.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return compressedFile;

}

public void postFeed(String commentString) {
    RequestQueue mqueue = Volley.newRequestQueue(getActivity());
    Map<String, String> params = new HashMap<String, String>();
    params.put("access_token", SettingsHelper.getInstance(getActivity()).getPreference("auth_token"));
    params.put("text", commentString);
    params.put("user_id", SettingsHelper.getInstance(getActivity()).getPreference("id"));
    params.put("privacy", Integer.toString(1));
    TSUServerRequest.postFeed(getActivity(), mqueue, params, compress(), new Response.Listener<String>() {
        @Override
        public void onResponse(String s) {
            Log.d("a", "bscljk");
            filePath = "";
            fileUri = null;
            //Toast.makeText(getActivity(),"Success",Toast.LENGTH_LONG).show();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            volleyError.printStackTrace();

        }
    });

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从相机捕获图像并使用 volley 上传到服务器

如何使用相机和图库android将图像上传到服务器

上传到服务器时相机图像旋转

使用HTTP POST请求将图像从android上传到服务器

在 Jmeter 中发布请求时,Zip 文件未上传到服务器

android:将图像上传到服务器,base64encoded或multipart / form-data?

如何使用 multipart/form-data 发送将图像文件上传到 LINE 服务器的请求,以便将图像发布到 LINE Notify?

如何使用HTTP POST multipart / form-data将文件上传到服务器?

图片未上传到PHP服务器iOS 10

如何在 React Native 中将内部存储图像上传到服务器。图像未上传到服务器。在反应原生

Java Android将图像上传到服务器

Android无法将图像上传到服务器

将图像从android上传到PHP服务器

从Android设备将图像上传到服务器

使用windows.web.http从Windows Phone 8.1将图像上传到服务器

使用tinymce将图像上传到服务器

使用Alamofire将图像上传到服务器

使用改造将图像上传到服务器

使用AsyncTask将图像或视频上传到服务器

使用 cURL 将图像上传到 PHP 服务器?

如何使用 UnityWebRequest 将图像上传到服务器

将图像上传到服务器

如何使用Android Volley库将位图图像上传到服务器?

在Android中将数据上传到Internet上的服务器

使用Android HTTP客户端将文件上传到REST api服务器

使用python上传到服务器后,我们可以从图像中提取图像元数据吗?

文件未上传到服务器,但没有错误

git成功推送存储库但文件未上传到远程服务器

将图像上传到服务器并将图像路径存储在mysql数据库中