آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

آپلود فایل از طریق برنامه روی سرور [آموزش]

احسان منصوری  9 سال پیش  5 سال پیش
+43 0

سلام. من دنبال یک سورس برای آپلود فایل روی سرور میگشتم که علاوه بر کاربردی بودن، ساده و قابل فهم هم باشه. گفتم برای شما عزیزان هم بذارم. امیدوارم بدردتون بخوره.

قسمت سرور:

اول از همه، اگه سرورتون، سیستم خودتون هست، wamp رو اجرا کنید و داخل پوشه www، پوشه ای به نام دلخواه(در اینجا، androidupload) ایجاد کنید. و داخل اون یک فایل PHP با نام UploadToServer بسازید و کدهای زیر رو داخلش قرار بدید.

  <?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 داخل پوشه androidupload بسازید تا فایل های آپلود شده وارد این پوشه بشن.

اگه سرورتون واقعی هست، وارد cpanelش بشید و در مسیر اصلی اون (که همون public_html هست) مراحل بالا رو انجام بدین.

خب، قسمت اندروید:

1- بعد از ایجاد یک پروژه جدید، قبل از هر کاری، Permissionهای زیر رو در منیفست وارد کنید.

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2- داخل کدهای XML مربوط به Layout پروژه تون، کدهای زیر رو بنویسید.

     <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="آپلود فایل"
        android:id="@+id/uploadButton"
        />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text=""
        android:id="@+id/messageText"
        android:textColor="#000000"
        android:textStyle="bold"
        />

3- خب، کدهای زیر رو داخل کلاس پروژه تون (MainActivity) وارد کنید.

    TextView messageText;
    Button uploadButton;
    int serverResponseCode = 0;
    ProgressDialog dialog = null;

    String upLoadServerUri = null;

    /**********  مسیر فایل داخل حافظه گوشی *************/
    final String uploadFilePath = Environment.getExternalStorageDirectory().getPath() +"/imgfolder/";
    final String uploadFileName = "test-photo.jpg";

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        uploadButton = (Button)findViewById(R.id.uploadButton);
        messageText  = (TextView)findViewById(R.id.messageText);

        messageText.setText("Uploading file path :- '/sdcard/imgfolder/"+uploadFileName+"'");

        /************* کدهای آپلود فایل ****************/
/********که میتوان به جای آی پی، آدرس سرور وارد نمود**********/ upLoadServerUri = "192.168.1.100/androidupload/UploadToServer.php"; uploadButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog = ProgressDialog.show(UploadToServer.this, "", "Uploading file...", true); new Thread(new Runnable() { public void run() { runOnUiThread(new Runnable() { public void run() { messageText.setText("uploading started....."); } }); uploadFile(uploadFilePath + "" + uploadFileName); } }).start(); } }); } public int uploadFile(String sourceFileUri) { String fileName = sourceFileUri; HttpURLConnection conn = null; DataOutputStream dos = null; String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 1 * 1024 * 1024; File sourceFile = new File(sourceFileUri); if (!sourceFile.isFile()) { dialog.dismiss(); Log.e("uploadFile", "Source File not exist :" +uploadFilePath + "" + uploadFileName); runOnUiThread(new Runnable() { public void run() { messageText.setText("Source File not exist :" +uploadFilePath + "" + uploadFileName); } }); return 0; } else { try { // open a URL connection to the Servlet FileInputStream fileInputStream = new FileInputStream(sourceFile); URL url = new URL(upLoadServerUri); // Open a HTTP connection to the URL conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); // Allow Inputs conn.setDoOutput(true); // Allow Outputs conn.setUseCaches(false); // Don't use a Cached Copy conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("ENCTYPE", "multipart/form-data"); conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); conn.setRequestProperty("uploaded_file", fileName); dos = new DataOutputStream(conn.getOutputStream()); dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""+fileName + "\"" + lineEnd); dos.writeBytes(lineEnd); // create a buffer of maximum size bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); buffer = new byte[bufferSize]; // read file and write it into form... bytesRead = fileInputStream.read(buffer, 0, bufferSize); while (bytesRead > 0) { dos.write(buffer, 0, bufferSize); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); bytesRead = fileInputStream.read(buffer, 0, bufferSize); } // send multipart form data necesssary after file data... dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); // Responses from the server (code and message) serverResponseCode = conn.getResponseCode(); String serverResponseMessage = conn.getResponseMessage(); Log.i("uploadFile", "HTTP Response is : " + serverResponseMessage + ": " + serverResponseCode); if(serverResponseCode == 200){ runOnUiThread(new Runnable() { public void run() { String msg = "فایل مورد نظر آپلود شد.\n\n می توانید آنرا در این مسیر ببینید : \n\n" +" 192.168.1.100/androidupload/uploads/" +uploadFileName; messageText.setText(msg); Toast.makeText(UploadToServer.this, "آپلود فایل کامل شد.", Toast.LENGTH_SHORT).show(); } }); } //close the streams // fileInputStream.close(); dos.flush(); dos.close(); } catch (MalformedURLException ex) { dialog.dismiss(); ex.printStackTrace(); runOnUiThread(new Runnable() { public void run() { messageText.setText("MalformedURLException Exception : check script url."); Toast.makeText(UploadToServer.this, "MalformedURLException", Toast.LENGTH_SHORT).show(); } }); Log.e("Upload file to server", "error: " + ex.getMessage(), ex); } catch (Exception e) { dialog.dismiss(); e.printStackTrace(); runOnUiThread(new Runnable() { public void run() { messageText.setText("Got Exception : see logcat "); Toast.makeText(UploadToServer.this, "Got Exception : see logcat ", Toast.LENGTH_SHORT).show(); } }); Log.e("Upload file to server Exception", "Exception : " + e.getMessage(), e); } dialog.dismiss(); return serverResponseCode; } // End else block }

 

موفق و موید باشید...

0 0
تشکر (8 سال پیش)
0 0
چرا فایل های بیشتر از 1 مگابایت رو اپلود نمیکنه؟ (8 سال پیش)
+1 0
چون که ما در قسمت maxBufferSize، حجم تصویر رو محدود کردیم. میتونید اون رو افزایش بدین (8 سال پیش)
0 0
ممنون بابت آموزش خوبتون (8 سال پیش)
0 0
افزایش دادم اما بازم اپلود نمیکنه...این روش ایمنه؟ (8 سال پیش)
0 0
maxBufferSize مقداریه که با هر اجرا اپلود میشه و برای سرعت بهتره. اما اینکه هرکاری میکنم فایل بالای دو مگابایت رو اپلود کنم نمیشه نمیدونم دلیل چیه! (8 سال پیش)
+1 0
من زیاد کدها رو بررسی نکردم ولی این چیزی ک میگی تو برنامه نویسی بهش برخوردم (نه برنامه نویسی آندروید). برای آپلود فایل ما یک بافر داریم که یه حجمی داره و این حجم اصلا ربطی به کل حجم فایل ما نداره و فقط به ما میگه که هربار این مقدار از فایل ما رو بردار (بسته به حجم بافر) یعنی هر چی حجم بافر رو بالا ببریم به قول خودت سرعت بهتر میشه برای رفع مشکل باید به دنبال جایی بگردی که این بافر هر بار داخل اون ریخته میشه (آرایه) و حجم اون رو بالا ببری تا بتونه کل فایل رو دریافت کنه و نه قسمتی از اون رو. امیدوارم گیجت نکرده باشم :) (8 سال پیش)
0 0
خيلي وقت بود دنبال اين سوري ميگشتم ممنون دوست عزيز (6 سال پیش)
 برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال 
علی  8 سال پیش
0 0

 اگه بخوایم مقدار حجم آپلود شده را در هر زمانی داشته باشیم چجوری اوونو محاسبه میکنیم ؟ بخواهیم مقدار رو در progressBar نشون بدیم چی؟



0 0
خب دوست من یه ProgressDialog تعریف کن تا خطاش برطرف بشه. (8 سال پیش)
0 0
ممنون واقعا . نمیدونستم (8 سال پیش)
پاسخ به سوال 
mahdiFar77  8 سال پیش
0 0

با سلام

از این خط ارور میگیره

dos = new DataOutputStream(conn.getOutputStream());

این هم از اروراش

Exception : cannot write request body after response has been read

java.net.ProtocolException: cannot write request body after response has been read

at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:194)

 

ممنون میشم راهنمایی کنید.

0 0
از من هم همین خط را ایراد میگیره شما موفق شدید که مشکل را برطرف کنید؟ (5 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .