آموزش آپلود فایل در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش آپلود فایل در برنامه نویسی اندروید می پردازیم در اندروید امکان ندارد فایل را مستقیما آپلود کنیم و باید از یک واسط برای اینکار استفاده کنیم واسط ما در اینجا یک فایل php است که از آن برای آپلود استفاده می کنیم شاید بشه گفت در اینجا اندروید واسط است چون ادرس فایل توسط اپ به دست می آید و سپس یک request به وب سرور ارسال می شود در ادامه با ما همراه باشید.
ابتدا فایل php را ایجاد می کنیم نام این فایل برابر با UploadToServer.php است این فایل باید در سایت یا هاست شما ایجاد شود در صورتی که می خواهید local تست کنید می توانید از xampp یا برنامه های مشابه استفاده کنید.
1 2 3 4 5 6 7 8 9 | <?php $file_path = "uploads/"; $file_path = $file_path . basename( $_FILES['uploaded_file']['name']); if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $file_path) ){ echo "success"; } else{ echo "fail"; } ?> |
در صورتی که این فایل ایجا کردید یک پوشه به نام uploads ایجاد کنید تا فایل ها که آپلود می شوند در آن قرار گیرد. اگر سایت ما برابر با programchi باشد ادرس همانند زیر می شود.
1 | http://programchi.ir/UploadToServer.php |
و فایل آپلود شده در مسیر زیر قابل دسترسی خواهد بود البته در وب سرور خودتان در سرور ما چیزی به نام این فایل وجود ندارد.
1 | http://programchi.ir/uploads |
حالا برویم به سراغ کد های اندروید
وارد AndroidManifest.xml شده و دسترسی های زیر را اضافه کنیم.
1 2 3 | <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> |
کد مربوط به activity_main.xml همانند زیر می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="@dimen/activity_vertical_margin" android:background="@color/colorAccent" tools:context=".MainActivity"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:textSize="18sp" android:id="@+id/tvHeading" android:text="Touch the icon below to upload file to server" android:textColor="#fff" android:textStyle="bold"/> <ImageView android:id="@+id/ivAttachment" android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/attach_icon" android:layout_centerVertical="true" android:layout_centerHorizontal="true"/> <TextView android:id="@+id/tv_file_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#fff" android:layout_marginTop="10dp" android:gravity="center" android:layout_below="@+id/ivAttachment" android:layout_centerHorizontal="true"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/b_upload" android:text="Upload" android:textStyle="bold" android:textSize="20sp" android:layout_alignParentBottom="true" android:gravity="center" android:textColor="#fff" android:background="#039be5"/> </RelativeLayout> |
حالا باید یک کلاس درست کنیم که مسیر را از حافظه برای ما برگرداند یعنی چیزی را ما انتخاب می کنیم
پس برای این کار یک فایل به نام FilePath.java ایجاد کرده و کد های زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | package ir.programchi; /** * Created by Jefferson on 24-Feb-16. */ import android.content.ContentUris; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.provider.DocumentsContract; import android.provider.MediaStore; public class FilePath { public static String getPath(final Context context, final Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } } else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(context, contentUri, null, null); } else if (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } final String selection = "_id=?"; final String[] selectionArgs = new String[] { split[1] }; return getDataColumn(context, contentUri, selection, selectionArgs); } } else if ("content".equalsIgnoreCase(uri.getScheme())) { if (isGooglePhotosUri(uri)) return uri.getLastPathSegment(); return getDataColumn(context, uri, null, null); } else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = { column }; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int index = cursor.getColumnIndexOrThrow(column); return cursor.getString(index); } } finally { if (cursor != null) cursor.close(); } return null; } public static boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri .getAuthority()); } public static boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri .getAuthority()); } public static boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri .getAuthority()); } public static boolean isGooglePhotosUri(Uri uri) { return "com.google.android.apps.photos.content".equals(uri .getAuthority()); } } |
برای اینکه provider که باز می شود تا فایل را بگیرد در گوشی های مختلف پشتیبانی شود و یکسری بررسی های کلی برای اینکه متوجه بشویم چه نوع فایلی انتخاب می شود و یا اینکه کاربر حافظه اصلی آن قابل دسترسی است و mount شده باشد.
و در آخر هم کد مربوط به MainActivity.java همانند زیر می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 | package com.coderefer.uploadfiletoserver; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private static final int PICK_FILE_REQUEST = 1; private static final String TAG = MainActivity.class.getSimpleName(); private String selectedFilePath; private String SERVER_URL = "http://programchi.ir/UploadToServer.php"; ImageView ivAttachment; Button bUpload; TextView tvFileName; ProgressDialog dialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ivAttachment = (ImageView) findViewById(R.id.ivAttachment); bUpload = (Button) findViewById(R.id.b_upload); tvFileName = (TextView) findViewById(R.id.tv_file_name); ivAttachment.setOnClickListener(this); bUpload.setOnClickListener(this); } @Override public void onClick(View v) { if(v== ivAttachment){ showFileChooser(); } if(v== bUpload){ //on upload button Click if(selectedFilePath != null){ dialog = ProgressDialog.show(MainActivity.this,"","Uploading File...",true); new Thread(new Runnable() { @Override public void run() { uploadFile(selectedFilePath); } }).start(); }else{ Toast.makeText(MainActivity.this,"Please choose a File First",Toast.LENGTH_SHORT).show(); } } } private void showFileChooser() { Intent intent = new Intent(); intent.setType("*/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent,"Choose File to Upload.."),PICK_FILE_REQUEST); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode == Activity.RESULT_OK){ if(requestCode == PICK_FILE_REQUEST){ if(data == null){ return; } Uri selectedFileUri = data.getData(); selectedFilePath = FilePath.getPath(this,selectedFileUri); Log.i(TAG,"Selected File Path:" + selectedFilePath); if(selectedFilePath != null && !selectedFilePath.equals("")){ tvFileName.setText(selectedFilePath); }else{ Toast.makeText(this,"Cannot upload file to server",Toast.LENGTH_SHORT).show(); } } } } public int uploadFile(final String selectedFilePath){ int serverResponseCode = 0; HttpURLConnection connection; DataOutputStream dataOutputStream; String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; int bytesRead,bytesAvailable,bufferSize; byte[] buffer; int maxBufferSize = 1 * 1024 * 1024; File selectedFile = new File(selectedFilePath); String[] parts = selectedFilePath.split("/"); final String fileName = parts[parts.length-1]; if (!selectedFile.isFile()){ dialog.dismiss(); runOnUiThread(new Runnable() { @Override public void run() { tvFileName.setText("Source File Doesn't Exist: " + selectedFilePath); } }); return 0; }else{ try{ FileInputStream fileInputStream = new FileInputStream(selectedFile); URL url = new URL(SERVER_URL); connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true);//Allow Inputs connection.setDoOutput(true);//Allow Outputs connection.setUseCaches(false);//Don't use a cached Copy connection.setRequestMethod("POST"); connection.setRequestProperty("Connection", "Keep-Alive"); connection.setRequestProperty("ENCTYPE", "multipart/form-data"); connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); connection.setRequestProperty("uploaded_file",selectedFilePath); dataOutputStream = new DataOutputStream(connection.getOutputStream()); dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd); dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\"" + selectedFilePath + "\"" + lineEnd); dataOutputStream.writeBytes(lineEnd); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable,maxBufferSize); buffer = new byte[bufferSize]; bytesRead = fileInputStream.read(buffer,0,bufferSize); while (bytesRead > 0){ dataOutputStream.write(buffer,0,bufferSize); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable,maxBufferSize); bytesRead = fileInputStream.read(buffer,0,bufferSize); } dataOutputStream.writeBytes(lineEnd); dataOutputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); serverResponseCode = connection.getResponseCode(); String serverResponseMessage = connection.getResponseMessage(); Log.i(TAG, "Server Response is: " + serverResponseMessage + ": " + serverResponseCode); if(serverResponseCode == 200){ runOnUiThread(new Runnable() { @Override public void run() { tvFileName.setText("File Upload completed.\n\n You can see the uploaded file here: \n\n" + "http://programchi.ir/uploads/"+ fileName); } }); } //closing the input and output streams fileInputStream.close(); dataOutputStream.flush(); dataOutputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this,"File Not Found",Toast.LENGTH_SHORT).show(); } }); } catch (MalformedURLException e) { e.printStackTrace(); Toast.makeText(MainActivity.this, "URL error!", Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(MainActivity.this, "Cannot Read/Write File!", Toast.LENGTH_SHORT).show(); } dialog.dismiss(); return serverResponseCode; } } } |
در بالا تمای بخش ها که ممکن بود به خطا بخورد بررسی شده است مثل آپلود ناموفق یا کرش دادن سرور در هنگا آپلود و stable بودن سرور برای آپلود همه چیز با کمی دقت آن ها را خواهید دید.
این آموزش هم به پایان رسید.
موفق و موید باشید.
تو activity result شرط else چ زمانی برقرار هست ؟
else{
Toast.makeText(this,”Cannot upload file to server”,Toast.LENGTH_SHORT).show();
}
زمانی که سرور پاسخ گو نباشد یعنی یه مشکلی برای سرور پیش آماده باشد و از دسترس خارج شده باشد.
مربوط به سرور نمیشه . تو قسمت onActivityResult نوشته شده .
می تواند مربوط باشد در صورتی که فایل خراب باشد یا سرور مشکل داشته باشد و فایل نتواند آپلود شود پیام خطا برای شما نمایش داده می شود.
سلام
کد های مربوط به این صفحه
http://programchi.ir/UploadToServer.php
چی هستن ؟
برنامه فایل هارو به این آدرس ارسال میکنه و طبق کد های این آدرس فایل هارو توی هاست شما ذخیره میکنه اگر میشه کد های این صفحه رو هم قرار بدید
آقا من این رو انجام دادم انصافا کار نمیده
ای کاش پروژه رو اپلود میکردی
یک فایل phpساختم با html برای تست کردن ، تستش کردم اکی بود.
امااین کدهای شمادر برنامه ی اندروید اصلا کارنداد متاسفانه.
هرکاریش کردم جواب نداد …تروخداخیلی بهش نیاز دارم اگه امکان داره کله پروژه رو برامون بزارید…..کتابخونهاش و…خیلی مهم هست دسته کم بفهمیمم این کتابخانه هاکجاهستن
باسپاس
من منتظرم حتماجواب بدید که انصافا گیرم
این کدهای php من هستن .فایل وفکرکرنم میگیره اماخروجی هم میده اما به جای نوع و اندازه مقدار تهی برمگیردونه .
یعنی پس از اپلود سایزش رو تهی میده /امابا html اپلود میکنم کدهام درست کارمیکنه
دوستان این کد هم به برنامه اضافه کنید دقیقا بالای
if(serverResponseCode == 200)
چرا؟؟؟؟؟؟؟؟؟چون اینجوری به محتوای body یا php هم دست میبابید …..من دوست داشتم خروجی کدهای html بگیرم وسطش داده گذاشته بودم
لطفا mes رو متغیرسراسری تغریف کنید ک بتونید چاپش کنید
باسلام
یه سوال داشتم
چرا وقتی این پروژه رو روی دیوایسی نصب میکنم به خاطر این قسمت ارور میده !!
return getDataColumn(context, contentUri, selection,
selectionArgs);
اگ میشه راهنمایی کنید !!
دوستان این برنامه یک اشکال داره هرکس فهمید کجاشه؟؟؟؟؟؟؟؟؟؟؟؟؟؟
dataOutputStream.writeBytes(“Content-Disposition: form-data; name=\”uploaded_file\”;filename=\””
+ selectedFilePath + “\”” + lineEnd);
دوستان قسمت uploaded_file در خط بالا رونگاه کنید
حتماحتماحتما باید این نام با نام FILES[“file”][“name”] درقسمت php یکی باشه .یعنی file رو با uploade_file باید عوض کرد
یعنی اینجوری
FILES[“uploade_file”][“name”]
سلام من توی عکسای دوربین داخل گالری انتخاب میکنم خطا میده قسمت tmp_name هستش در پی اچ پی دلیلش چیه
سلام شما باید دسترسی به برنامه اضافه کنید تا عکس انتخاب کنید آموزش زیر را بررسی کنید
http://programchi.ir/?s=runtimepermission
tmp_name یک نام موقت برای استفاده است.
موفق باشید.
سلام خسته نباشید
من اون کدای php که تو مرورگر سرچ میکنم پیغام زیر نشون داده میشه
Notice: Undefined index: uploaded_file in C:\xampp\htdocs\musicBox\UploadToServer.php on line 5
Notice: Undefined index: uploaded_file in C:\xampp\htdocs\musicBox\UploadToServer.php on line 6
fail
یک پوشه به نام uploaded_file در xampp در مسیر فایل UploadToServer.php ایجاد کنید.
سلام خسته نباشید
ممنون از پاسخگوییتون
من کدارو که اجرا میکنم برنامه اجرا میشه فایل هم انتخاب میکنم و آپلود رو که میزنم برنامه پیغام has stopped میده و میاد بیرون
و توی logcat اررور زیر رو نشون میده: err: java.net.SocketException: Connection reset
میدونید مشکلش چی هستش؟
سلام
ممکنه سمت سرور شما خطا داشته باشه.
سلام خسته نباشید
اگر بخوام موقع انتخاب فایل به جای اینکه بشه یه فایل رو انتخاب کرد چند تا فایل رو انتخاب کرد و بعدش آپلود کرد چیکار باید کنم؟
سلام
مرسی ممنون از آموزشی که گذاشتید
برای من اولش روی کلیک لیستنر ها ایراد میگرفت ولی بعدش درست شد و فایل به سرور xamp آپلود شد
الان در پوست خودم نمیگنجم چقد دنبال این آموزش میگشتم ولی کار نمیکرد اونایی که بود
کاش یه توضیحی هم رو هر آیتمی میدادید چون من این رو خط به خط کپی کردم فقط و نفهمیدم دقیقا چی شدش !!
فقط الان یه مشکلی که من بهش خوردم وقتی خواست عکس رو از داخل کارت حافظه بخونه برنامه کرش کرد و گفت پرمیژن نداره
اولش که وارد برنامه میشی ازت پرمیژن نمیگیره
من رو اندروید 6 تست کردم
وقتی رفتم خودم تو تنظیمات بهش دسترسی دادم برنامه کار کرد
حالا مشکل از کجاست که خودش پرمیژن رو نمیگیره؟؟
و اینکه اگه پرمیژن نداشته باشه نباید کرش کنه باید بگه دسترسی موجود نیست
شما باید از runtimepermission استفاده کنید که آموزش های در سایت هست که باعث میشه خود برنامه از کاربر دسترسی رو بگیره و نیازی نباشه کاربر همون کاری که شما کردید رو انجام دهد.
http://programchi.ir/?s=runtime
موفق باشید.
تشکر اقا محمد حسین
اموزشتون عالی بود
سلام، ممنون از آموزشتون، من کد آپلود را مینوسیم همه چیز خوبه تا زمانی که داره آپلود میکنه بالای صفحه گوشی که آپلود را نمایش میده ناقص انجام میشه و میگه آپلود نشد، تو برنامه هم خطایی نمیده
فقط یه موردی هست سمت سرور ما با mvc هست و فقط یه آدرس برای آپلود به من داده که این آدرس هم وقتی توی نوار آدرس میزنم شامل عکس های سایت هست، بهشون گفتم نباید فایلی بنویسن شبیه همین php گفتن نه و دسترسی های لازم داده شده. به نظرتون مشکل از کجاست؟
سلام و درود
بسته به کدی که سمت سرور شما نوشتن شما باید عکس رو POST کنید مطمئنن که باید POST بکنید ولی به چه شکلی بستگی داره سمت سرور چه جوری نوشته شده باشه و اینکه فکر می کنم باید شما به صورت BASE64 عکس رو POST کنید و اونطرف بگیرن کد PHP رو از طرف سرور دریافت کنید قرار بدید بهتر می تونیم کمکتون کنیم.
اموزش بالا تست شده است و اگرم دقت کرده باشید ما اومدیم خودمون SCRIP برای بخش آپلودش نوشتیم.
موفق باشید.
سلام
از من همه چیش درسته فقط فایل که آپلود شده رو تو HOST نمیبینم
فکر کنم اصلا نیست
دوستان انجامش دادم و به درستی کار میکنه …
برای اینکه برای بار اول مطمئن بشید که درست کار میکنه تمامی متغیر ها رو مشابه همین فایل قرار بدید غیر از نام سرور که اطمینان پیدا کنید
حتما هم بایستی فولدر uploads رو خودتون ایجاد کنید و موضوعی که من داشتم و یکم وقتمو گرفت این بود که بزرگ و کوچیک بودن حرف اول نام فولدر uploads رو ایراد میگرفت و نمیشناخت …
تو آموزشی نام فولدر را با uploads نوشته یعتی با u کوچیک اما شما که فولدر رو ایجاد میکنید خود به خود گاهی وقتا Uploads ایجاد میشه و حرف U رو بزرگ میکنه
توی کد PHP هم میتونید
$file_path = “Uploads/”;
رو جایگزین کنید
سلام.
ممنون از راهنماییهاتون
لطفاً میشه بگید اگه بخوایم همراه با ارسال فایل، یه سری متغیر هم به صورت post ارسال کنیم باید چیکار کنیم؟
سلام و درود
بسته به وب سرویس متفاوت هست ولی شما می توانید مقادیر رو در url به صورت post بفرستید.
سلام . ممنون از اموزش خوبتون .
من رو عکس امتحان کردم با موفقیت آپلود شد ولی خواستم آهنگ اپلود کنم داخل برنامه اندروید گفت که انجام شد ولی رفتم داخل پوشه رو دیدم هیچی نبود و یه فایل log بود که خطا ها رو مینویسه . تو فایل log نوشته بود خط 5 و 6 دارای مشکل هستن . این متن کامل ارور :
[06-Dec-2018 06:06:29 UTC] PHP Notice: Undefined index: uploaded_file in /home/zahediha/public_html/UploadToServer.php on line 5
[06-Dec-2018 06:06:29 UTC] PHP Notice: Undefined index: uploaded_file in /home/zahediha/public_html/UploadToServer.php on line 6
من از هاست سی پنل استفاده میکنم .
خسته نباشید…. با کتابخانه اندروید نتوورکینگ همه این کارها با چند خط کد ساده انجام میشه.. باهاش کار کردید؟
سلام وقت بخیر ببخشید کد بسیار عالی است و سرعت خیلی خوبی هم داره فقط در مورد جواب که سایت بعد آپلود فایل بهمون برمی گردونه چطور باید بگیرمش
serverResponseMessage = connection.getResponseMessage();
این فقط کمی از جواب بر می گردونه ولی حسون کامل بر نمی گردونه
سلام و درود این متد به درستی کار می کند به احتمال زیاد خروجی شما مشکل دارد Log بگیرید.
موفق و پیروز باشید.
خب هاست ما یه یوزرنیم و پسورد داره ولی شما تو اموزش بهش اشاره نکردید
همینجوری نمیشه که وصل شد به هاست
من طبق اموزش جلو رفتم و اطلاعات تو هاستم ذخیر میشه ولی سایز اطلاعاته ذخیره شده 0کیلوبایته
میشه راهنمایی کنید
سلام خسته نباشید بابت سایت خوبتون تشکر میکنم.من از کدای شما استفاده کردم منتهی یه مشکلی هست فایلهایی که با نام فارسی اپلود میشه هاید میشه تو Directory به این شکل نام فایل رو نمیزنه فقط پسوند رو میزنه چطور باید حلش کرد ممنون میشم راهنمایی کنید
باسلام
ممنون بابت آموزش خوبتون.
فقط یه مشکلی داشتم. موقع انتخاب فایل از حافظه خارجی یا از پوشه دانلود ارور Cannot upload file to server رو میده.
سلام ممنون از آموزش خوبتون – برای نمایش درصد آپلود کجارو میشه تغییر داد؟