【发布时间】:2016-01-13 18:10:55
【问题描述】:
在活动 A 中,它有 3 个listView。单击提交按钮时,我想将文本和 imagePath 存储到 MySQL 中,并将图像存储在 PhotoUpload 文件夹中。
String imagess;
Uri imgURI;
public void uploadImageAndText(ArrayList<ImageAndText> listItems, final String id) {
JSONArray jsonArray = new JSONArray();
try {
for (ImageAndText i : listItems) {
JSONObject object = new JSONObject();
String type = i.getType();
String[] Type = type.split(":");
object.put("type", Type[1]);
Toast.makeText(getApplicationContext(), Type[1], Toast.LENGTH_LONG).show();
String amount = i.getAmount();
String[] Amount = amount.split(":");
object.put("amount", Amount[1]);
String description = i.getDescription();
String[] Description = description.split(":");
object.put("description", Description[1]);
Uri uploadImage = i.getImage(); //not sure
object.put("image", uploadImage); // not sure
object.put("ts_id", id);
jsonArray.put(object);
}
} catch (JSONException e) {
e.printStackTrace();
}
AddStaff ru = new AddStaff(jsonArray);
ru.execute();
}
class AddStaff extends AsyncTask<String, Void, String> {
ProgressDialog loading;
JSONArray jsonArray;
AddStaff(JSONArray jsonArray) {
this.jsonArray = jsonArray;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
loading = ProgressDialog.show(AddClaims.this, "Please Wait", null, true, true);
}
@Override
protected String doInBackground(String... params) {
HashMap<String, String> data = new HashMap<String, String>();
data.put("listItems", jsonArray.toString());
data.put(Configs.KEY_IMAGE,imagess); // not sure
RequestHandler rh = new RequestHandler();
String result = rh.sendPostRequest(Configs.STAFF_BENEFIT, data);
return result;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
loading.dismiss();
Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG).show();
}
}
}
staffBenefit.php
<?php
if( $_SERVER['REQUEST_METHOD']=='POST' ){
if( !empty( $_POST['listItems'] ) ){
$mysqli = new mysqli("127.0.0.1:3307", "root", "", "androiddb");
if( $mysqli->connect_errno ) echo "Failed to connect to MySQL";
$image = $_POST['image'];
$listItems = json_decode( $_POST['listItems'], true );
$sql="SELECT id FROM staff_benefit ORDER BY id ASC";
$id=0;
$res=$mysqli->query( $sql );
while( $rs=$res->fetch_object() ) $id=$rs->id;
$path="$id.png";
$actualpath="http://192.168.107.115:80/Android/CRUD/PhotoUpload/$path";
$sql="INSERT INTO `staff_benefit` ( `type`, `amount`, `description`, `image`, `ts_id` ) VALUES ( ?, ?, ?, ?, ? )";
$stmt=$mysqli->prepare( $sql );
$pathelements=array( realpath( $_SERVER['DOCUMENT_ROOT'] ), 'CRUD', 'PhotoUpload', '' );
$savepath = realpath( implode( DIRECTORY_SEPARATOR, $pathelements ) ) . "{$id}.png";
$bytes=file_put_contents( $savepath, base64_decode( $image ) );
if( !$bytes ){
echo 'Error saving image';
}
if ( $stmt ) {
foreach( $listItems as $item ){
$stmt->bind_param('sssss', $item['type'], $item['amount'], $item['description'], $actualpath, $item['ts_id'] );
$res=$stmt->execute();
if( !$res ) echo 'Query failed with code: '.$stmt->errno;
}
}
$mysqli->close();
}
}
?>
我的应用没有崩溃,但我在 logCat 中看到了这一点。
01-14 02:05:11.978 20483-21081/com.example.project.myapplication W/System.err﹕ java.lang.NullPointerException
01-14 02:05:11.978 20483-21081/com.example.project.myapplication W/System.err﹕ at libcore.net.UriCodec.encode(UriCodec.java:132)
01-14 02:05:11.978 20483-21081/com.example.project.myapplication W/System.err﹕ at java.net.URLEncoder.encode(URLEncoder.java:57)
01-14 02:05:11.978 20483-21081/com.example.project.myapplication W/System.err﹕ at com.example.project.myapplication.Handler.RequestHandler.getPostDataString(RequestHandler.java:118)
01-14 02:05:11.978 20483-21081/com.example.project.myapplication W/System.err﹕ at com.example.project.myapplication.Handler.RequestHandler.sendPostRequest(RequestHandler.java:51)
01-14 02:05:11.978 20483-21081/com.example.project.myapplication W/System.err﹕ at com.example.project.myapplication.GUI.AddClaims$AddInfo$AddStaff.doInBackground(AddClaims.java:480)
01-14 02:05:11.978 20483-21081/com.example.project.myapplication W/System.err﹕ at com.example.project.myapplication.GUI.AddClaims$AddInfo$AddStaff.doInBackground(AddClaims.java:459)
有人可以帮助我如何实现这一目标吗?如何将 URI 图像存储到文件夹中?谢谢。
已编辑
@Override
protected String doInBackground(String... params) {
for (int index = 0; index < jsonArray.length(); index++) {
try {
JSONObject jsonObject = jsonArray.getJSONObject(index);
String strUri = jsonObject.getString("image");
HashMap<String, String> data = new HashMap<String, String>();
data.put("listItems", jsonArray.toString());
data.put(Configs.KEY_IMAGE, getStringImage(Uri.parse(strUri)));
RequestHandler rh = new RequestHandler();
String result = rh.sendPostRequest(Configs.STAFF_BENEFIT, data);
return result;
} catch (Exception e) {
}
}
return "";
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
loading.dismiss();
Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG).show();
}
}
public String getStringImage(Uri imgUri) {
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imgUri);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] imageBytes = baos.toByteArray();
String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
return encodedImage;
} catch (Exception e) {
}
return "";
}
}
当我检查 MySQL 时,插入了三个数据,但存储在列 image 中的路径是相同的(最后一个),并且只有最后一个图像存储在 photoUpload 文件夹中。
假设有 36.png、37.png 和 38.png,但它只保存了 36.png
【问题讨论】:
-
使用
object.put("image", uploadImage.toString());而不是object.put("image", uploadImage); -
@ρяσѕρєяK 我应该为
imagess更改什么? -
@cricket_007 我读了很多次帖子,但仍然无法弄清楚我的问题
-
@Tony: 看看我的回答可能有帮助
标签: php android json image uri