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

آپلود فایل به سرور [حل شد]

مجتبی یگانه  9 سال پیش  5 سال پیش
+26 0

دوستان حداقل 10 تا سوال در این مورد هست ، هیچ کدوم جواب نگرفتن ، این یکی رو که من تا ایجا رسوندم ، همه جوره واستون گذاشتم ، لطفا گوگل کنید ، تست کنید ، ایده بدید ، نظر بدید ، یه جوری حلش کنیم دیگه !

من بعد کلی دردسر (چون Multipart منسوخ شده ) تونستم این طوری با MultiPartEntity فایل و متغییر ها رو به سرور بفرستم ، اما مشکل اینه ، همه چی میره سمت سرور ، به جز فایل ارسال شده ؛ اما هیچ لاگی هم نمیده که نشده ، یا exception بده ، هیچی !

اینم سورس کد ، اگر خواستید  تست کنید  کافیه apache-mime4j-0.6.jar و httpmime-4.0.1.jar رو ایمپورت کنید
اگه کلا خسته بودید (!) خوب پروژه ی قابل امپورت رو دانلود کنید !
نیازی به نوشتن کد سمت سرور نیست ، با سرور من تست کنید ، اگه پاسخ بشه "userID/Cat/image"  یعنی درسته ، ولی در حال حاظر پاسخ "userID/Cat" هست ، یعنی فایل سمت سرور نمیره !

 package ir.negano.Uploader;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.params.HttpParams;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;


public class ActivityMain extends Activity {

    private static DefaultHttpClient mHttpClient;


    public static void ServerCommunication() {
        HttpParams params = new BasicHttpParams();
        params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
        mHttpClient = new DefaultHttpClient(params);
    }


    public void uploadUserPhoto(File image) {

        try {

            HttpPost httppost = new HttpPost("http://logcat.ir/uproid.php");

            MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
            multipartEntity.addPart("userID", new StringBody("10"));
            multipartEntity.addPart("Cat", new StringBody("3"));
            multipartEntity.addPart("Image", new FileBody(image));
            httppost.setEntity(multipartEntity);

            HttpResponse result = mHttpClient.execute(httppost);
            InputStream stream;
            stream = result.getEntity().getContent();
             String resp
            Log.i("negano", "response is " + response);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static String inputstreamToString(InputStream inputStream) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        StringBuilder builder = new StringBuilder();

        try {
            String line;
            while ((line = reader.readLine()) != null) {
                builder.append(line);
            }

            return builder.toString();
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final String path = Environment.getExternalStorageDirectory() + "/1.jpg";
        findViewById(R.id.upload).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                ServerCommunication();
                uploadUserPhoto(new File(path));
            }
        });

    }
}
 برای این سوال 5 پاسخ وجود دارد.
پاسخ به سوال 
na3er-faraji  9 سال پیش
+7 0

دوست عزیز من متاسفانه امکان تست کد شما رو ندارم. ولی چند وقت پیش نیاز بوددر پروژه ای یک عکس به همراه سایر پارامترها به سرور ارسال بشه. روش زیر کاری بود که من انجام دادم.

 imgPicture.buildDrawingCache();
            Bitmap bitmap = imgPicture.getDrawingCache();
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); //compress to which format you want.
            byte[] byte_arr = stream.toByteArray();
            String image_str = com.navahi.helper.Base64.encodeBytes(byte_arr);

            params.add(new BasicNameValuePair("picture", image_str));

این هم تابعی که تو کد استفاده شده.

 /**
     * Encodes a byte array into Base64 notation.
     * Does not GZip-compress data.
     * 
     * @param source The data to convert
     * @return The data in Base64-encoded form
     * @throws NullPointerException if source array is null
     * @since 1.4
     */
    public static String encodeBytes(byte[] source) {
        // Since we're not going to have the GZIP encoding turned on,
        // we're not going to have an java.io.IOException thrown, so
        // we should not force the user to have to catch it.
        String encoded = null;
        try {
            encoded = encodeBytes(source, 0, source.length, NO_OPTIONS);
        }
        catch (java.io.IOException ex) {
            assert false : ex.getMessage();
        } // end catch
        assert encoded != null;
        return encoded;
    } // end encodeBytes

البته کد سمت سرورم به زبان asp.net هستش. ولی کد رو براتون میزارم تا دقیقا بفهمید اون ور داره چه اتفاقی می افته . دقت کنید ابتدا در دورودی تابع با عکسی که آپلود شده به شکل یک string رفتار میشه و بعد تبدیلش می کنم.

 if (!string.IsNullOrWhiteSpace(picture))
            {
                adsPicture = Helper.ConvertBase64ToImage(picture);
            }

این هم تابعی که سمت سرور داره تبدیل میکنه.

 public static Image ConvertBase64ToImage(string base64String)
    {
        // Convert Base64 String to byte[]
        byte[] imageBytes = Convert.FromBase64String(base64String);
        using (var ms = new MemoryStream(imageBytes, 0,
                                         imageBytes.Length))
        {
            // Convert byte[] to Image
            ms.Write(imageBytes, 0, imageBytes.Length);
            Image image = Image.FromStream(ms, true);
            return image;
        }
    }
0 0
تشکر ، برم تست کنم ، اطلاع میدم (9 سال پیش)
0 0
تست کردم ، عملی هست ، اما بعضی وقت ها با کدی که من نوشته بودم ، فایل خراب می شد (کد php مناسب نبود ) ، شما هم پاسخ دوستمون javac رو ببینید (9 سال پیش)
پاسخ به سوال 
javac  9 سال پیش
+19 0

این سورس کاملا تست شده و جواب میده :

UploadFile.java

 public class UploadFiles {

    public void upload(String selectedPath) throws IOException {
         HttpURLConnection c
        DataOutputStream outputStream = null;
        DataInputStream inputStream = null;

        String pathToOurFile = selectedPath;
        String urlServer = "http://test.ir/";
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";

        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 1 * 1024 * 1024;

        try {
            FileInputStream fileInputStream = new FileInputStream(new File(
                    pathToOurFile));

            URL url = new URL(urlServer);             c 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=" + boundary);

            outputStream = new DataOutputStream(connection.getOutputStream());
            outputStream.writeBytes(twoHyphens + boundary + lineEnd);
            outputStream
                    .writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\""
                            + pathToOurFile + "\"" + 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(twoHyphens + boundary + twoHyphens
                    + lineEnd);
             int serverResp
            String serverResp

            fileInputStream.close();
            outputStream.flush();
            outputStream.close();
        }
        catch (Exception ex) {}
    }
}

ActivityMain.java

 
public class ActivityMain extends Activity {

    private static final int SELECT_IMAGE = 1;
    String                   selectedImagePath;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.btnChoose).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);
            }
        });
        findViewById(R.id.btnUpload).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (selectedImagePath != null)
                    try {
                        UploadFiles uploadFile = new UploadFiles();
                        uploadFile.upload(selectedImagePath);
                    }
                    catch (IOException e) {}
            }
        });

    }


    @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);
            }
        }
    }


    public String getPath(Uri uri) {         String[] projecti MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

}

Server 

 <!--?php 
$target_path = "C:/myApp/";
$target_path = $target_path . basename($_FILES['uploadedfile']['name']);
 
error_log("Upload File -->>" . $target_path . $_FILES['error'] . " \r\n", 3,
    "Log.log");
 
error_log("Upload File >>" . basename($_FILES['uploadedfile']['name']) . " \r\n",
    3, "Log.log");
 
if (move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
    echo "The file " . basename($_FILES['uploadedfile']['name']) .
        " has been uploaded";
} else {
    echo "There was an error uploading the file, please try again!";
}
?>

 

+1 0
خیلی عالی ! ، خیلی چیزا یاد گرفتم ازش ، ولی یه سری چیزای نا مفهوم هست ، که برم ببینم چیه ! بازم مرسی (9 سال پیش)
+1 0
با این ساختار چطور میشه متغییر دیگه ای پست کرد ؟! ، چند جا امتحان کردم نشد ! (9 سال پیش)
+1 0
منظورتون از متغیر دیگه چی هست؟ اگر داده های رشته ای یا عددی هست که از طریق متد post در اندروید ارسال و در سرور دریافت کنید (9 سال پیش)
+2 0
یعنی میخوام همزمان با اون فایل که آپلود میشه ، 2 تا مقدار دیگه هم بفرستم ، مثلا ، عنوا ن فایل و ... ! ، با متد پست رو که بلدم ، میخوام با همین URL Connection داده بفرستم ! (9 سال پیش)
+1 0
این لینک رو ببین به دردت میخوره: لینک (9 سال پیش)
+1 0
ممنون بابت کد , فقط کد سمت سرور مشکل نداره؟ این C چیه؟ (9 سال پیش)
+1 0
راستی قسمت کلاسش این کد HttpURLConnection c ناقصه و connection و c url.openConnection(); مشکل داره , چطوری درستشون کنیم؟ (9 سال پیش)
+1 0
اقا این کد کلی مشکل داره , چرا اینطوریه؟ (9 سال پیش)
+3 0
بفرمائید گذاشتم رو گیت هابم واست ! لینک (9 سال پیش)
0 0
نوکرم (9 سال پیش)
0 0
خیلی خوبه برم تست کنم حالشو ببرم :دی (9 سال پیش)
+1 0
@ALU گیت هاب رو از کجا یاد گرفتی؟ هویجوری یا ... (9 سال پیش)
+1 0
والا انقدر حامد گفت گیت هاب جیت هاب ، منم رفتم سمت اش ! و به روش هویچوووری ! (9 سال پیش)
+1 0
مجتبی جون کار تیمی هم انجام میدی، یا همیشه انفرادی کار می کنی؟ (9 سال پیش)
+1 0
والا من و خودم و رایانه ام ، چند سالی میشه که تیم خوبی هستیم D: - چطور مگه ؟! (9 سال پیش)
0 0
منم برای خودم چند تا گروه فرضی دارم :) پارسی اپز و چند تا دیگه. اعضاش هم خودم هستم و خودم وخودم و... D: .دیدم برای خودت گروه تشکیل دادی نگانو (9 سال پیش)
+1 0
گروه من خیلی هم فرضی نیست ! ، تو برنامه نویسی اندروید گروهی کار نمی کنم :| ولی ضرر نداره که گروه داشته باشی D: (9 سال پیش)
0 0
مجتبی جان اگه بخواهیم چندتا فایل را همزمان با این برنامه که رو گیت هاب گذاشتی بفرستیم باید چه کنیم؟ (9 سال پیش)
+1 0
خوب برنامه رو Thread Base کنید ، اصلا حالا که آموزش های جدید همه اش شده ماژول ، یک ماژول بنویسید :) ، کافیه دست به کد بشید (9 سال پیش)
+1 0
@َALU میشه بگی چطوری میشه با متد post هم فایل فرستاد هم پارامتر ؟ (9 سال پیش)
0 0
واقعیت اش یادم نمیاد :| ، اما فکر کنم همون لینک javaC جواب داد ، یعنی نوشتن روی استریم ، اگر نهایتا نشد ، میتونی رو هدر مقدار ست کنی که setHeader داره ، بازم دقیق یادم نمیاد ! (9 سال پیش)
0 0
میشه یه توضیح مختصر راجب تابع getPath بدی توی این لینک (9 سال پیش)
+1 0
یه کد که میشه کلیشه ای اش استفاده کرد ! ، وقتی تصویر انتخاب میشه و شما به برنامه بر میگردید ، وارد onActivityResult میشین اونجا data ی اینتنت ( selectedImageUri ) رو میگیریم و میدیم به متد getPath تا selectedImagePath یعنی آدرس اون تصویر انتخاب شده رو به ما بده :) (9 سال پیش)
+1 0
دوستان لطفا کمک کنید چطور می شه با این کد پارامتر هم با تصویر به سرور ارسال کرد ؟؟ (9 سال پیش)
0 0
سلام میگم حالا مثلا چجور username هم بفرسم که ادرس عکس هم داخل جدول همون ذخیره کنم!من از طریق params بلدم ولی این فرق داره! (9 سال پیش)
0 0
میخوام همزمان با اون فایل که آپلود میشه ، 2 تا مقدار دیگه هم بفرستم ، مثلا ، عنوا ن فایل و ... ! ، با متد پست رو که بلدم ، میخوام با همین URL Connection داده بفرستم ! (7 سال پیش)
پاسخ به سوال 
محمد  9 سال پیش
+2 0

با سلام. من کد آقای alu رو دانلود کردم و استفاده کردم. اما مشکلم در مورد آپلود حل نشد.

آدرس عکسهام به طور مثال اینه:

String filePath = "/storage/sdcard1/DCIM/100ANDRO/DSC_0057.JPG"

فرمت آدرسم درسته یا اشتباه؟

و به این صورت به متد upload میفرستم:

  UploadFile.upload(filePath);

برنامه توی خط زیر متوقف میشه و جلوتر نمیره.

outputStream = new DataOutputStream(connection.getOutputStream());

یا فرمت آدرس عکسهام مشکل داره یا کد php یا آدرس سرور.

این:

 String urlServer = "http://192.168.2.186/test-upload/upload.php";

یا این:

 <?php
if(isset($_FILES['file'])){
$target_path = "/images/"; اینجا دقیقا چی باید بذارم؟
$target_path = $target_path . basename($_FILES['file']['name']);
if (move_uploaded_file($_FILES['file']['tmp_name'], $target_path)) {
die("1");
} else {
die("2");
}
}
?>

ممنون میشم کمک کنید از صبح تا حالا دارم تلاش میکنم.

0 0
help me (9 سال پیش)
0 0
خیلی تو اینترنت گشتم ولی بجوابم نرسیدم میتونین راهنمایی کنین؟ میخوام همزمان با اون فایل که آپلود میشه ، 2 تا مقدار دیگه هم بفرستم ، مثلا ، عنوا ن فایل و ... ! ، با متد پست رو که بلدم ، میخوام با همین URL Connection داده بفرستم ! (7 سال پیش)
پاسخ به سوال 
mahdiFar77  7 سال پیش
0 0

خیلی تو اینترنت گشتم ولی بجوابم نرسیدم میتونین راهنمایی کنین؟ میخوام همزمان با اون فایل که آپلود میشه ، 2 تا مقدار دیگه هم بفرستم ، مثلا ، عنوا ن فایل و ... ! ، با متد پست رو که بلدم ، میخوام با همین URL Connection داده بفرستم !

پاسخ به سوال 
mahdiFar77  7 سال پیش
0 0

بالاخره درست کردم.

 
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", selectedPath);

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

dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"title\""+ lineEnd);
dos.writeBytes(lineEnd);
dos.writeBytes("ok");
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + lineEnd);

dos.writeBytes("Content-Disposition: form-data; name=\"description\""+ lineEnd);
dos.writeBytes(lineEnd);
dos.writeBytes("Description");
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + lineEnd);

dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""
+ selectedPath + "\"" + lineEnd);

dos.writeBytes(lineEnd);

Log.e("TAG","Headers are written");

// create a buffer of maximum size
bytesAvailable = fileInputStream.available();

maxBufferSize = 1024;
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);
}
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){

}

//close the streams //
fileInputStream.close();
dos.flush();
dos.close();
0 0
ممنون، من از کدت استفاده کردم کار میکنه فقط دوتا سوال: 1- اینکه چرا وقتی متن فارسی می فرستم درست نمی فرسته و حروف انگلیسی می فرسته ولی حروف انگلیسی رو درست می فرسته؟ 2- اینکه روش اصولی آپلود فایل همینه؟ (5 سال پیش)
0 0
decode kon matnet ro (5 سال پیش)

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