2015-05-08 189 views
7

我试图使用HttpUrlConnection将base64编码图像发送到服务器。我遇到的问题是大多数图像被成功发送,但有些会生成FileNotFound异常。我编码图像的代码可以在下面找到。使用HttpUrlConnection将base64编码图像发送到服务器Android

public static String encodeImage(Bitmap thumbnail) { 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      thumbnail.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
      byte[] b = baos.toByteArray(); 
      String imageEncoded = Base64.encodeToString(b,Base64.URL_SAFE); 
      return imageEncoded; 
     } 

当我改变行:

String imageEncoded = Base64.encodeToString(b,Base64.URL_SAFE); 

到:

String imageEncoded = Base64.encodeToString(b,Base64.DEFAULT); 

那么大多数图像生成FileNotFoundException异常和一些被成功发送到服务器。下面

是我HttpURLConnection类代码:

public class HttpManager { 

    public static String getData(RequestPackage p) { 

     BufferedReader reader = null; 
     String uri = p.getUri(); 
     if (p.getMethod().equals("GET")) { 
      uri += "?" + p.getEncodedParams(); 
     } 

     try { 
      URL url = new URL(uri); 
      HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
      con.setRequestMethod(p.getMethod()); 


      if (p.getMethod().equals("POST")) { 
       con.setDoOutput(true); 
       OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream()); 
       writer.write(p.getEncodedParams()); //Url encoded parameters 
       writer.flush(); 
      } 

      StringBuilder sb = new StringBuilder(); 
      reader = new BufferedReader(new InputStreamReader(con.getInputStream())); 

      String line; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 

      return sb.toString(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } finally { 
      if (reader != null) { 
       try { 
        reader.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
        return null; 
       } 
      } 
     } 

    } 

} 

任何帮助将不胜感激。 谢谢

+0

为什么base64在所有? – pskink

+0

如果图像位图较大,请尝试缩小bitamp。 –

+0

其实,问题在于服务器端... prolly,服务器块太大的请求...仍然我不明白为什么不发送纯二进制代替... – Selvin

回答

2

我有同样的问题。只是使用下面的代码你会很好:

public class MainActivity extends AppCompatActivity { 

int SELECT_PICTURE = 101; 
int CAPTURE_IMAGE = 102; 
Button getImage; 
ImageView selectedImage; 
String encodedImage; 
JSONObject jsonObject; 
JSONObject Response; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    getImage = (Button) findViewById(R.id.get_image); 
    selectedImage = (ImageView) findViewById(R.id.selected_image); 

    final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
    builder.setTitle("Profile Picture"); 
    builder.setMessage("Chooose from?"); 
    builder.setPositiveButton("GALLERY", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      startActivityForResult(intent, SELECT_PICTURE); 
     } 
    }); 
    builder.setNegativeButton("CANCEL", null); 


} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // Check which request we're responding to 
    if (requestCode == SELECT_PICTURE) { 
     // Make sure the request was successful 
     Log.d("Vicky","I'm out."); 
     if (resultCode == RESULT_OK && data != null && data.getData() != null) { 
      Uri selectedImageUri = data.getData(); 
      Bitmap selectedImageBitmap = null; 
      try { 
       selectedImageBitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImageUri); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      selectedImage.setImageBitmap(selectedImageBitmap); 
      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
      selectedImageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream); 
      byte[] byteArrayImage = byteArrayOutputStream.toByteArray(); 
      encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT); 
      Log.d("Vicky","I'm in."); 
      new UploadImages().execute(); 
     } 
    } 
} 

private class UploadImages extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 

    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     try { 
      Log.d("Vicky", "encodedImage = " + encodedImage); 
      jsonObject = new JSONObject(); 
      jsonObject.put("imageString", encodedImage); 
      jsonObject.put("imageName", "+917358513024"); 
      String data = jsonObject.toString(); 
      String yourURL = "http://54.169.88.65/events/eventmain/upload_image.php"; 
      URL url = new URL(yourURL); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoOutput(true); 
      connection.setDoInput(true); 
      connection.setRequestMethod("POST"); 
      connection.setFixedLengthStreamingMode(data.getBytes().length); 
      connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8"); 
      OutputStream out = new BufferedOutputStream(connection.getOutputStream()); 
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8")); 
      writer.write(data); 
      Log.d("Vicky", "Data to php = " + data); 
      writer.flush(); 
      writer.close(); 
      out.close(); 
      connection.connect(); 

      InputStream in = new BufferedInputStream(connection.getInputStream()); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        in, "UTF-8")); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line); 
      } 
      in.close(); 
      String result = sb.toString(); 
      Log.d("Vicky", "Response from php = " + result); 
      //Response = new JSONObject(result); 
      connection.disconnect(); 
     } catch (Exception e) { 
      Log.d("Vicky", "Error Encountered"); 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void args) { 

    } 
    } 
} 
+0

谢谢,它帮助我! – Martin

+0

@Martin我很高兴它帮助你。 – Vicky

+0

@Martin但这个答案已经过时了,请使用这个https://futurestud.io/tutorials/retrofit-2-how-to-upload-files-to-server – Vicky

1

默认的DEFAULT字母可能有一个'/'。换句话说,当您运行Base64.encodeToString(b,Base64.DEFAULT)时,结果中将以'/'结尾。 我会仔细检查服务器端HTTP请求路径中的路径。

+0

你是对的'Base64.encodeToString(b, Base64.DEFAULT)'不是网址安全的。我最近才知道这一点。 – Vicky

相关问题