آپلود عکس از گوشی روی دیتابیس
سلام دوستان
اگه کسی بلد هست کامل توضیح بده ممنون میشم
فرض کنین روی یک imageView کلیک بشه و بتونم از توی گوشی یک عکس انتخاب کنم و در دیتابیس ذخیره کنم . و بعدش طبق آموزش Downloader استاد ، از دیتابیس لینک عکس رو بگیره و دانلود کنه و نمایش بده
تا همین جا کسی میتونه راهنمایی کنه ؟؟
مدل پیشرفته ترش هم هست که بعد از اینکه عکس رو از گوشی انتخاب کردیم ، صفحه ای باز میشه و میتونیم عکس رو EDIT کنیم مثلا Crop کنیم و بعدش آپلود کنیم !!!
هم اکنون نیازمند یاری سبزتان هستیم ...
خُب این قضیه رو من چند وقت پیش بهش بر خوردم و راه های مختلفی هم براش وجود داره .
اول از همه اینکه شما عکس رو در دیتابیس ذخیره نکنید ، عکس رو توی هاست یا روی مموری ذخیره کنید و آدرس عکس رو داخل دیتابیس ذخیره کنید .
حالا برای انتخاب عکس و یا گرفتن عکس با دوربین دستگاه راه های زیادی هست که من توضیح نمیدم و میتونید برید در stackoverflow سرچ بزنید و راه حل دلخواهتون رو پیدا کنید .
اما برای آپلود عکس بر روی سرور شما 2 راه دارید :
اولین راه این هست که لایبری مربوط به Apache وجود داره برای ارسال اطلاعات به صورت MultiPart این امکان در اندروید دپریکیت شده و بدون استفاده از این لایبری امکان پذیر نیست .
شما باید لایبری های apache-mime4j-0.6 و httpmime-4.2.4 رو برای اندروید که به صورت jar فایل هست از لینک زیر بگیرید و به پروژتون اضافی کنید .
و برای نحوه استفاده هم لینک زیر میتونید اطلاعات لازم رو کسب کنید :
در این روش شما فایل مورد نظر رو چه عکس باشه یا هر چیز دیگه رو میگیرید و برای سرور میفرستید و اونجا ذخیره میکنید.
روش دوم تبدیل فایل عکس به String هست :
در این روش شما نیازی به لایبری ندارید و میتونید با استفاده از Base64 عکس رو به بایت تبدیل کنید و برای سرور داخل یک استرینگ بفرستید و در سمت سرور دوباره به فایل برگردون کنید و ذخیره سازی .
فقط نکته ای که هست شما در روش اول مستقیم فایل رو میفرستید و مشکلی هم پیش نمیاد ولی در روش دوم حجم فایل شما تا 20% افزایش پیدا میکنه .
موفق باشید :)
متاسفانه نفهمیدم :-(
من هر کار کردم نشد. یعنی گیر کردم.عکس رو از گوشی انتخاب میکنم و همین.دیگه معلوم نیست عکس کجا میره و چی میشه و ...
اگه امکانش هست یک مثال بزنید ممنون میشم
اتفاقا منم قصدم همین بود که آدرس عکس به صورت String ذخیره کنم
مثلا قطعه کدی که میزنم اینه :
int SELECT_IMAGE = 1;
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_IMAGE);
اون لایبراری هارو هم اضافه کردم و الان موندم چه کنم
بنده طبق توضیحات یکی از دوستان در این لینک اومدم یک کلاس uploadFile نوشتم و در اونجا اون فایلی که از گوشی میگیره رو آپلود میکنم :
package com.blogfa.iranianpopstars.course.app.billboard;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class UploadFiles {
private static String Result = "";
public static String upload(String selectedPath) {
HttpURLConnection connection = null;
DataOutputStream outputStream = null;
String FilePath = selectedPath;
String urlServer = "http://192.168.56.1/note-server/service.php";
String lineEnd = "\r\n";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 8 * 1024;
try {
FileInputStream fileInputStream = new FileInputStream(new File(FilePath));
URL url = new URL(urlServer);
connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=");
outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.writeBytes("--" + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"file\";filename=\"" + FilePath + "\"" + lineEnd);
outputStream.writeBytes(lineEnd);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
outputStream.writeBytes(lineEnd);
outputStream.writeBytes("----" + lineEnd);
InputStream InStream = connection.getInputStream();
Result = InputStreamToString(InStream);
fileInputStream.close();
outputStream.flush();
outputStream.close();
}
catch (Exception e) {
e.printStackTrace();
}
return Result;
}
private static String InputStreamToString(InputStream inStream) {
BufferedReader reader = new BufferedReader(new InputStreamReader(inStream));
StringBuilder builder = new StringBuilder();
String line;
try {
while ((line = reader.readLine()) != null) {
builder.append(line);
}
return builder.toString();
}
catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
}
catch (IOException e) {
e.printStackTrace();
}
try {
inStream.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
return "";
}
}
حالا توی ActivityMain این جوری نوشتم :
String selectedImagePath;
private static final int SELECT_IMAGE = 1;
Thread ThreadUpload;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == SELECT_IMAGE) {
Uri selectedImageUri = data.getData();
selectedImagePath = getPath(selectedImageUri);
}
}
}
chooseImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent_gallery = new Intent();
intent_gallery.setType("image/*");
intent_gallery.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent_gallery, SELECT_IMAGE);
}
});
btnUpload.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (selectedImagePath != null) {
progress.setVisibility(View.VISIBLE);
btnUpload.setEnabled(false);
ThreadUpload = new Thread(new Runnable() {
@Override
public void run() {
final String response = UploadFiles.upload(selectedImagePath);
ActivityMain.handler.post(new Runnable() {
@Override
public void run() {
try {
int intRes = Integer.parseInt(response);
switch (intRes) {
case 1:
Toast.makeText(getApplicationContext(), "File Uploaded !", Toast.LENGTH_LONG).show();
break;
case 2:
Toast.makeText(getApplicationContext(), "File Not Uploaded !", Toast.LENGTH_LONG).show();
break;
default:
Toast.makeText(getApplicationContext(), "Unkown Error , Try Again", Toast.LENGTH_LONG).show();
}
progress.setVisibility(View.GONE);
// btnUpload.setEnabled(true);
}
catch (Exception e) {
e.printStackTrace();
}
}
});
}
});
ThreadUpload.start();
}
else {
Toast.makeText(getApplicationContext(), "Please Select a File First !", Toast.LENGTH_SHORT).show();
}
و در نهایت کد پی اچ پی که اصلا نفهمیدم چی هست
احتمال زیاد من توی کارم اشتباه کردم و شاید چیزی از قلم افتاده
این کد پی اچ پی:
<?php
if (isset($_FILES['file'])){
$target_path = "";//path like "../uploads/images/"
$target_path = $target_path . basename($_FILES['file']['name']);
$img_url = $target_path;
if (move_uploaded_file($_FILES['file']['tmp_name'], $target_path)) {
die("1");
} else {
die("2");
}
حالا اینکه چطوری تعیین کنم عکس کجا میره و ... خدا داند. اما بعد از آپلود اون قسمت که در activityMain هست و سوییچ کرده ، قسمت اول سوویچ اجرا میشه یعنی میگه عکس آپلود شد ...
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .