【问题标题】:How do I use Android HTTPPOST jpeg to Django Server?如何使用 Android HTTPPOST jpeg 到 Django 服务器?
【发布时间】:2012-02-27 05:35:51
【问题描述】:

这是我的第一个 android 应用程序,我正在尝试将在相机 (ICS 4.0) 上拍摄的图像发布到 Django 服务器。我一直收到一个 NULL 指针异常错误,但我不知道这是在哪里发生的。此外,当我不尝试上传时应用程序崩溃。我不确定发生了什么。我正在使用片段。

这是我的 Django 邮政编码:

    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)

这是我在相机动作后片段中的内容:

    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
        }
    }
}

提前致谢!

错误:

     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

【问题讨论】:

  • 如果你得到空指针异常,请发布异常回溯。它显示了问题所在。

标签: android django sqlite http-post jpeg


【解决方案1】:

以下代码是如何捕获图像

    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");  
   }    
}

将图像转换为位图后,将位图转换为字符串中的Base64编码以下方法是将位图转换为字符串

  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; 
    }

在转换 ImageString 之后,然后使用 Http Post 方法发送这个 ImageString

      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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多