22

我想在 android 的解析云服务器中上传图像。但我无法这样做。

我尝试了以下代码:

    Drawable drawable = getResources().getDrawable(R.drawable.profilepic) ;
    Bitmap bitmap = (Bitmap)(Bitmap)drawable()
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] data = stream.toByteArray();                

    ParseFile imageFile = new ParseFile("image.png", data);
    imageFile.saveInBackground();

请让我知道我该怎么做。


我添加了一个赏金来为这个常见问题找到最好的权威代码

4

6 回答 6

18

经过几个小时的努力,这里的代码段对我有用。

1.活动类的数据成员

Bitmap bmp;
Intent i;
Uri BmpFileName = null;

2. 启动相机。目标是启动相机活动和 BmpFileName 以存储对文件的引用

String storageState = Environment.getExternalStorageState();
if (storageState.equals(Environment.MEDIA_MOUNTED)) {

String path = Environment.getExternalStorageDirectory().getName() + File.separatorChar + "Android/data/" + this.getPackageName() + "/files/" + "Doc1" + ".jpg";

File photoFile = new File(path);
try {
if (photoFile.exists() == false) { 
photoFile.getParentFile().mkdirs();
photoFile.createNewFile();
}
} 
catch (IOException e) 
{
Log.e("DocumentActivity", "Could not create file.", e);
}
Log.i("DocumentActivity", path);
BmpFileName = Uri.fromFile(photoFile);
i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(MediaStore.EXTRA_OUTPUT, BmpFileName);
startActivityForResult(i, 0);

3.通过覆盖onActivityResult从Camera输出中读取内容。目标是评估 bmp 变量。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
try {
bmp = MediaStore.Images.Media.getBitmap( this.getContentResolver(), BmpFileName);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {

// TODO Auto-generated catch block
e.printStackTrace();
}
// Myocode to display image on UI - You can ignore
if (bmp != null)
IV.setImageBitmap(bmp);
}
}

4. 保存事件

// MUST ENSURE THAT YOU INITIALIZE PARSE
Parse.initialize(mContext, "Key1", "Key2");

ParseObject pObj = null;
ParseFile pFile = null ;
pObj = new ParseObject ("Document");
pObj.put("Notes", "Some Value");

// Ensure bmp has value
if (bmp == null || BmpFileName == null) {
Log.d ("Error" , "Problem with image"
return;
}

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(CompressFormat.PNG, 100, stream);
pFile = new ParseFile("DocImage.jpg", stream.toByteArray());
try 
{
pFile.save();
pObj.put("FileName", pFile);
pObj.save();
_mParse.DisplayMessage("Image Saved");
} 
catch (ParseException e) 
{
// TODO Auto-generated catch block
_mParse.DisplayMessage("Error in saving image");
e.printStackTrace();
}

// 在我的情况下完成活动。你可以选择其他的东西finish();

所以这是与其他人的主要区别

  • 我调用了初始化解析。您可能会对此一笑置之,但人们已经花了几个小时调试代码,却没有意识到 parse 没有初始化
  • 使用 Save 而不是 SaveInBackground。我知道它可能会举行活动,但这对我来说是理想的行为,更重要的是它有效

让我知道它是否不起作用

于 2014-05-29T17:25:43.563 回答
8

在后台保存 ParseObject

// ParseObject
  ParseObject pObject = new ParseObject("ExampleObject");
  pObject.put("myNumber", number);
  pObject.put("myString", name);
  pObject.saveInBackground(); // asynchronous, no callback

使用回调在后台保存

pObject.saveInBackground(new SaveCallback () {
   @Override
   public void done(ParseException ex) {
    if (ex == null) {
        isSaved = true;
    } else {
        // Failed
        isSaved = false;
    }
  }
});

save...() 方法的变体包括:

    saveAllinBackground() saves a ParseObject with or without a callback.
    saveAll(List<ParseObject> objects) saves a list of ParseObjects.
    saveAllinBackground(List<ParseObject> objects) saves a list of ParseObjects in the 
    background.
    saveEventually() lets you save a data object to the server at some point in the future; use 
    this method if the Parse cloud is not currently accessible.

一旦 ParseObject 成功保存在云上,它就会被分配一个唯一的 Object-ID。这个 Object-ID 非常重要,因为它唯一地标识了 ParseObject 实例。例如,您将使用 Object-ID 来确定对象是否已成功保存在云中、检索和刷新给定的 Parse 对象实例以及删除特定的 ParseObject。

我希望你能解决你的问题..

于 2013-04-30T06:01:53.993 回答
1
Parse.initialize(this, "applicationId", "clientKey");

     byte[] data = "Sample".getBytes();    //data of your image file comes here

     final ParseFile file = new ParseFile(data);
     try {
        file.save();
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
     if (file.isDirty()){
                     //exception or error message etc 
     }
     else{

         try {
            ParseUser.logIn("username", "password");    //skip this if already logged in
        } catch (ParseException e2) {
            e2.printStackTrace();
        }
         ParseObject userDisplayImage = new ParseObject("UserDisplayImage");
            user = ParseUser.getCurrentUser();
            userDisplayImage.put("user", user);     //The logged in User
            userDisplayImage.put("displayImage", file); //The image saved previously
            try {
                userDisplayImage.save();      //image and user object saved in a new table. Check data browser
            } catch (ParseException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

         //See how to retrieve

         ParseQuery query = new ParseQuery("UserDisplayImage");
         query.whereEqualTo("user", user);
         try {
            parseObject = query.getFirst();
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         ParseFile imageFile = null;
          imageFile = parseObject.getParseFile("displayImage");
          try {
            byte[] imgData = imageFile.getData(); //your image data!!
        } catch (ParseException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

     }
于 2013-04-30T06:08:56.133 回答
1

像这样使用它

 //Convert Bitmap to Byte array --For Saving Image to Parse Db. */

 Bitmap profileImage= "your bitmap";

 ByteArrayOutputStream blob = new ByteArrayOutputStream();

 profileImage.compress(CompressFormat.PNG, 0 /* ignored for PNG */,blob);

 imgArray = blob.toByteArray();

 //Assign Byte array to ParseFile
 parseImagefile = new ParseFile("profile_pic.png", imgArray);

 parseUser.getCurrentUser().put("columname in parse db", parseImagefile);
 parseUser.getCurrentUser().saveInBackground();

我希望这能帮到您..

于 2013-09-25T08:56:35.293 回答
1

Imageupload 和 retriving 的简单代码使用 Glide 进行解析。

图片上传

destination_profile是您要上传图片路径的 File 对象。

    ParseUser currentUser = ParseUser.getCurrentUser();
    if (destination_profile != null) {
            Glide.with(getActivity()).load(destination_profile.getAbsolutePath()).asBitmap().toBytes().centerCrop().into(new SimpleTarget<byte[]>() {
                @Override
                public void onResourceReady(byte[] resource, GlideAnimation<? super byte[]> glideAnimation) {


                    final ParseFile parseFile = new ParseFile(destination_profile.getName(), resource);
                    parseFile.saveInBackground(new SaveCallback() {
                        @Override
                        public void done(ParseException e) {
                            currentUser.put("picture", parseFile);
                            currentUser.saveInBackground(new SaveCallback() {
                                @Override
                                public void done(ParseException e) {
                                    showToast("Profile image upload success");
                                }
                            });
                        }
                    });


                }
            });
        }

图像检索

img_userProfilePicture_bg是您要设置图像的 ImageView 的对象。

    ParseUser currentUser = ParseUser.getCurrentUser();
    if (currentUser.has("picture")) {
        ParseFile imageFile = (ParseFile) currentUser.get("picture");
        imageFile.getDataInBackground(new GetDataCallback() {
            public void done(final byte[] data, ParseException e) {
                if (e == null) {

                    Glide.with(getActivity()).load(data).centerCrop().into(img_userProfilePicture_bg);

                } else {
                    // something went wrong
                }
            }
        });
    }
于 2015-12-14T05:32:04.613 回答
0

假设你有你的位图文件bitmap

    ParseObject object = new ParseObject("NameOfClass");

    ByteArrayOutputStream stream = new ByteArrayOutputStream();

    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    byte[] scaledData = stream.toByteArray();

    ParseFile image = new ParseFile("image.jpeg",scaledData);
    image.saveInBackground(new SaveCallback() {
        @Override
        public void done(ParseException e) {
            if (e==null)
                //Image has been saved as a parse file.
            else
                //Failed to save the image as parse file.
        }
    });

    object.put("images",image);
    object.saveInBackground(new SaveCallback() {
        @Override
        public void done(ParseException e) {
            if (e==null)
                //Image has been successfuly uploaded to Parse Server.
            else
                //Error Occured.
        }
    });

byte[]在将位图与解析对象关联之前,将位图转换为解析文件并上传非常重要。

于 2018-06-09T17:02:26.960 回答