Я пытаюсь загрузить изображение, снятое с камеры или галереи, на сервер php. Для этого я использую библиотеку Фаст-Android-сети
С моим кодом я вижу, что файл пишет на сервере, однако, он сохраняется с 0 B
, так же onProgress
Функция выводит правильные записанные байты.
Любая помощь с этим? Как правильно передать файл, снятый с камеры или галереи, на сервер с помощью этой библиотеки?
private File mFileTemp;
btn_update.setOnClickListener(new OnClickListener() {
// Start new list activity
public void onClick(View v) {
uploadFileNew(pref.getString("user_id", null));
}
});
public void uploadFileNew(String frm_iduser) {
String uploadUrl = "https://plus.example.com/apps/mobile/registered_users/uploadProfilePicAndroid.php?fileName=" + frm_iduser + ".png";
AndroidNetworking.upload(uploadUrl)
.addMultipartFile("image",mFileTemp)
.addMultipartParameter("key","value")
.setTag("uploadTest")
.setPriority(Priority.HIGH)
.build()
.setUploadProgressListener(new UploadProgressListener() {
@Override
public void onProgress(long bytesUploaded, long totalBytes) {
// do anything with progress
Log.d("responce_app",String.valueOf(bytesUploaded));
}
})
.getAsJSONObject(new JSONObjectRequestListener() {
@Override
public void onResponse(JSONObject response) {
// do anything with response
Log.d("responce_app",String.valueOf(response));
}
@Override
public void onError(ANError error) {
// handle error
Log.d("responce_app",String.valueOf(error));
Log.d("responce_app","errorrrr");
}
});
}
Я кодировал точный сценарий, когда увидел твой вопрос. И я рад сообщить вам, что только что сделал это.
Вот код Android:
@Override
public void onClick(View view) {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, 5000);
}
public String getRealPathFromURI(Uri contentURI, Activity context) {
String[] projection = { MediaStore.Images.Media.DATA };
@SuppressWarnings("deprecation")
Cursor cursor = context.managedQuery(contentURI, projection, null,
null, null);
if (cursor == null)
return null;
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
if (cursor.moveToFirst()) {
String s = cursor.getString(column_index);
// cursor.close();
return s;
}
// cursor.close();
return null;
}
@Override
protected void onActivityResult(int reqCode, int resultCode, Intent data) {
super.onActivityResult(reqCode, resultCode, data);if (resultCode == RESULT_OK) {
try {
final Uri selectedImageUri = data.getData();
//final InputStream imageStream = //getContentResolver().openInputStream(selectedImageUri);
//final Bitmap selectedImage = //BitmapFactory.decodeStream(imageStream);
//imgUser.setImageBitmap(selectedImage);
String imagepath = getRealPathFromURI(selectedImageUri,this);
File imageFile = new File(imagepath);AndroidNetworking.upload("http://test.sth.com/upload_file4.php")
.addMultipartFile("file", imageFile)
//.addMultipartParameter("key","value")
//.setTag("uploadTest")
.setPriority(Priority.HIGH)
.build()
.setUploadProgressListener(new UploadProgressListener() {
@Override
public void onProgress(long bytesUploaded, long totalBytes) {
// do anything with progress
tvProgress.setText((bytesUploaded / totalBytes)*100 + " %");
}
})
.getAsString(new StringRequestListener() {
@Override
public void onResponse(String response) {
Toast.makeText(MainActivity.this, response, Toast.LENGTH_SHORT).show();
}
@Override
public void onError(ANError anError) {
Toast.makeText(MainActivity.this, anError.getMessage(), Toast.LENGTH_SHORT).show();
}
});} catch (FileNotFoundException e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, "Something went wrong", Toast.LENGTH_LONG).show();
}
}else {
Toast.makeText(MainActivity.this, "You haven't picked Image",Toast.LENGTH_LONG).show();
}
}
Вот код php:
<?php
$target_dir = "uploads/";
$target_file_name = $target_dir.basename($_FILES["file"]["name"]);
$response = array();
if(isset($_FILES["file"]))
{
if(move_uploaded_file($_FILES["file"]["tmp_name"],$target_file_name))
{
$success = true;
$message = "Uploaded!!!";
}
else
{
$success = false;
$message = "NOT Uploaded!!! _ Error While Uploading";
}
}
else{
$success = false;
$message = "missing field";
}
$response["success"] = $success;
$response["message"] = $message;
echo json_encode($response);
?>
Замечания:
1. Добавьте эти разрешения в свой манифест:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Также убедитесь, что вы добавили эту строку в свой OnCreate
:
AndroidNetworking.initialize (getApplicationContext ());
Кажется, с вашим кодом все в порядке. Похоже, ваш серверный код виноват здесь.
Опубликовать содержимое uploadProfilePicAndroid.php
так что мы можем найти проблему.
Также нет необходимости передавать имя файла по адресу:
String uploadUrl = "https://plus.example.com/apps/mobile/registered_users/uploadProfilePicAndroid.php?fileName=" + frm_iduser + ".png"
В коде php вы можете получить доступ к файлу, используя имя "image"
Вы указали здесь:
.addMultipartFile("image",mFileTemp)
Кроме того, всякий раз, когда вам необходимо отправить дополнительные данные в вашем запросе, делайте это, используя библиотеку, а не адрес, как вы это сделали с "key"
а также "value"
:
.addMultipartParameter("key","value")