我如何使用Android HTTPPOST JPEG到Django的服务器?如何使用、服务器、Android、HTTPPOST

2023-09-06 17:05:25 作者:心已麻木i

这是我的第一个Android应用程序,我试图张贴摄像头(ICS 4.0)关于采取措施,Django的服务器映像。我一直得到一个空指针异常错误,但我不知道该在哪里发生。此外,当我没有应用程序崩溃试图上传时。我不知道是怎么回事。我使用的片段。

下面是我的Django后code:

  DEF后(个体经营,请求,* ARGS,** kwargs):        图像= get_object_or_404(图,** kwargs)        研究所=实例(流= image.stream)        uploaded_file = \\            文件( - 。JPG,self.FILES [0] .read(),图像/ JPEG')        SETATTR(研究所,'全',uploaded_file)        inst.save()        返回的Htt presponse(状态= HTTP_201_CREATED) 
Android JPEG 压缩那些事

下面是我在我的片段相机操作后:

 公共无效的onActivityResult(INT申请code,INT结果code,意图数据){    如果(要求code == CAPTURE_IMAGE_ACTIVITY_REQUEST_ code){        如果(结果code == Activity.RESULT_OK){            //把图像投影到服务器            text.setText(outputFileUri.toString());            尝试{                HttpClient的HttpClient的=新DefaultHttpClient();                HttpContext的localContext =新BasicHttpContext();                HttpPost postRequest =新HttpPost(http://192.168.1.2:8000/v1/14/1/imagesink/1/);                MultipartEntity reqEntity =新MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);                BM = BitmapFactory.de codeFILE(/ SD卡/ test.jpg放在);                位图bmpCom pressed = Bitmap.createScaledBitmap(BM,640,480,TRUE);                ByteArrayOutputStream BOS =新ByteArrayOutputStream();                bmpCom pressed.com preSS(比较pressFormat.JPEG,100,BOS);                字节[]字节= bos.toByteArray();                reqEntity.addPart(MYIMAGE,新ByteArrayBody(字节temp.jpg));                postRequest.setEntity(reqEntity);                HTT presponse响应= httpClient.execute(postRequest,localContext);                的BufferedReader读者=新的BufferedReader(新的InputStreamReader(response.getEntity()的getContent(),UTF-8)。);                串sResponse = reader.readLine();            }赶上(例外五){                //这里处理异常                Log.v(对myApp,某些错误想出了);            }        }否则如果(结果code == Activity.RESULT_CANCELED){            //用户取消了图像采集        }其他{            //图像捕捉失​​败,提醒用户        }    }} 

在此先感谢!

ERROR:

  E / AndroidRuntime(19787):致命异常:主要     了java.lang.RuntimeException:不提供结果ResultInfo {谁=安卓片段:0,请求= 1,结果= -1,数据= NULL}到活动{} com.prism.app/com.prism.app.PrismActivity:显示java.lang.NullPointerException:需要的println消息     在android.app.ActivityThread.deliverResults(ActivityThread.java:2976)     在android.app.ActivityThread.handleSendResult(ActivityThread.java:3019)     在android.app.ActivityThread.access $ 1100(ActivityThread.java:122)     在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1176)     在android.os.Handler.dispatchMessage(Handler.java:99)     在android.os.Looper.loop(Looper.java:137)     在android.app.ActivityThread.main(ActivityThread.java:4340)     在java.lang.reflect.Method.invokeNative(本机方法)     在java.lang.reflect.Method.invoke(Method.java:511)     在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 在dalvik.system.NativeStart.main(本机方法)         显示java.lang.NullPointerException:引起的println需要一个消息 在android.util.Log.println_native(本机方法) 在android.util.Log.e(Log.java:231) 在com.prism.app.OneFragmentTab.onActivityResult(OneFragmentTab.java:106)     在android.app.Activity.dispatchActivityResult(Activity.java:4653)     在android.app.ActivityThread.deliverResults(ActivityThread.java:2972)     ... 11更多 

解决方案

以下code是如何捕捉图像

 意图cameraIntent =新意图(android.provider.MediaStore.ACTION_IM​​AGE_CAPTURE);    startActivityForResult(cameraIntent,CAMERA_REQUEST);保护无效的onActivityResult(INT申请code,INT结果code,意图数据){       如果(要求code == CAMERA_REQUEST)   {       。位图的照片=(位图)data.getExtras()获得(数据);   }} 

获取图像中的位图然后将其转换位图到字符串下面的方法的Base64编码后的位图转换为字符串

 公共字符串convert_bitmap_to_string(位图位图)    {            ByteArrayOutputStream full_stream =新ByteArrayOutputStream();        bitmap.com preSS(Bitmap.Com pressFormat.PNG,100,full_stream);        字节[] = full_bytes full_stream.toByteArray();        字符串Str_image = Base64.en codeToString(full_bytes,Base64.DEFAULT);        返回Str_image;    } 

然后转换使用和imagestring HTTP POST方法发送和imagestring后

 的HttpClient HttpClient的=新DefaultHttpClient();    HttpPost httppost =新HttpPost(HTTP://www.URL ...);    清单<&的NameValuePair GT; namevaluepairs中=新的ArrayList<&的NameValuePair GT;(1);    nameValuePairs.add(新BasicNameValuePair(参数名,Str_image));    HTT presponse响应= httpclient.execute(httppost);      HttpEntity实体= response.getEntity();       字符串的responseText = EntityUtils.toString(实体); 

This is my first android app and I am trying to POST images taken on the camera (ICS 4.0) to a Django server. I have been getting a NULL pointer exception error but I have no clue where this is occurring. Also, When I don't the app crashes when trying to upload. I'm not sure what is going on. I am using Fragments.

Here is my Django post code:

    def post(self, request, *args, **kwargs):
        image = get_object_or_404(Img, **kwargs)

        inst = Instance(stream=image.stream)
        uploaded_file = \
            File('-.jpg', self.FILES[0].read(), 'image/jpeg')
        setattr(inst, 'full', uploaded_file)
        inst.save()

        return HttpResponse(status=HTTP_201_CREATED)

Here is what I have in my Fragment after the camera action:

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {
            // put the image onto server
            text.setText(outputFileUri.toString());

            try {
                HttpClient httpClient = new DefaultHttpClient();
                HttpContext localContext = new BasicHttpContext();
                HttpPost postRequest = new HttpPost("http://192.168.1.2:8000/v1/14/1/imagesink/1/");
                MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

                bm = BitmapFactory.decodeFile("/sdcard/test.jpg");
                Bitmap bmpCompressed = Bitmap.createScaledBitmap(bm, 640, 480, true);
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                bmpCompressed.compress(CompressFormat.JPEG, 100, bos);
                byte[] bytes = bos.toByteArray();
                reqEntity.addPart("myImage", new ByteArrayBody(bytes, "temp.jpg")); 
                postRequest.setEntity(reqEntity);
                HttpResponse response = httpClient.execute(postRequest,localContext);

                BufferedReader reader = new BufferedReader(new InputStreamReader( response.getEntity().getContent(), "UTF-8"));  
                String sResponse = reader.readLine();

            } catch (Exception e) {
                // handle exception here
                Log.v("myApp", "Some error came up");  
            }

        } else if (resultCode == Activity.RESULT_CANCELED) {
            // User cancelled the image capture
        } else {
            // Image capture failed, advise user
        }
    }
}

Thanks in advance!

ERROR:

     E/AndroidRuntime(19787): FATAL EXCEPTION: main
     java.lang.RuntimeException: Failure delivering result ResultInfo{who=android:fragment:0, request=1, result=-1, data=null} to activity {com.prism.app/com.prism.app.PrismActivity}: java.lang.NullPointerException: println needs a message
     at android.app.ActivityThread.deliverResults(ActivityThread.java:2976)
     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3019)
     at android.app.ActivityThread.access$1100(ActivityThread.java:122)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1176)
     at android.os.Handler.dispatchMessage(Handler.java:99)
     at android.os.Looper.loop(Looper.java:137)
     at android.app.ActivityThread.main(ActivityThread.java:4340)
     at java.lang.reflect.Method.invokeNative(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:511)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
 at dalvik.system.NativeStart.main(Native Method)
         Caused by: java.lang.NullPointerException: println needs a message
 at android.util.Log.println_native(Native Method)
 at android.util.Log.e(Log.java:231)
 at com.prism.app.OneFragmentTab.onActivityResult(OneFragmentTab.java:106)
     at android.app.Activity.dispatchActivityResult(Activity.java:4653)
     at android.app.ActivityThread.deliverResults(ActivityThread.java:2972)
     ... 11 more

解决方案

following code is how to capture image

    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(cameraIntent, CAMERA_REQUEST); 

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{

       if (requestCode == CAMERA_REQUEST)
   {  
       Bitmap photo = (Bitmap) data.getExtras().get("data");  
   }    
}

after getting image in to bitmap then convert bitmap in to encoding Base64 in string following method is convert bitmap to string

  public String convert_bitmap_to_string(Bitmap bitmap)
    {
            ByteArrayOutputStream full_stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, full_stream);
        byte[] full_bytes = full_stream.toByteArray();
        String Str_image = Base64.encodeToString(full_bytes, Base64.DEFAULT);

        return Str_image; 
    }

after converting ImageString then Send this ImageString using Http Post method

      HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://www.URL...");
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);

    nameValuePairs.add(new BasicNameValuePair("param name",Str_image));

    HttpResponse response = httpclient.execute(httppost);
      HttpEntity entity = response.getEntity();
       String responseText = EntityUtils.toString(entity);