آپلود فایل به سرور [حل شد]
دوستان حداقل 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)); } }); } }
دوست عزیز من متاسفانه امکان تست کد شما رو ندارم. ولی چند وقت پیش نیاز بوددر پروژه ای یک عکس به همراه سایر پارامترها به سرور ارسال بشه. روش زیر کاری بود که من انجام دادم.
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; } }
این سورس کاملا تست شده و جواب میده :
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!"; } ?>
با سلام. من کد آقای 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");
}
}
?>
ممنون میشم کمک کنید از صبح تا حالا دارم تلاش میکنم.
خیلی تو اینترنت گشتم ولی بجوابم نرسیدم میتونین راهنمایی کنین؟ میخوام همزمان با اون فایل که آپلود میشه ، 2 تا مقدار دیگه هم بفرستم ، مثلا ، عنوا ن فایل و ... ! ، با متد پست رو که بلدم ، میخوام با همین URL Connection داده بفرستم !
بالاخره درست کردم.
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();
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .