PDA

View Full Version : سوال در مورد آپلود عکس به سرور



msartin
جمعه 20 مرداد 1396, 21:50 عصر
با سلام به همه دوستان گرامی.
بنده مبتدی هستم و یک برنامه برای آپلود عکسهام به سرور احتیاج دارم.
این کدهارو از اینترنت گرفتم و تا حدودی ویرایش کردم ولی سرورم هیچی دریافت نمیکنه
به احتمال 90 درصد کدهای اندرویدم مشکل دارن.
اگه دوستان کسی میتونه، لطف کنه کمک کنه، خیلی برام ضروریه.
با تشکر.




import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.methods.HttpPost;
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.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;


public class SendpicActivity extends Activity {

//Declaring views
private Button buttonUpload;
private TextView messageText;
private int serverResponseCode = 0;

String upLoadServerUri = null;

/********** File Path *************/
final String uploadFilePath = G.DIR_APP;
final String uploadFileName = "aval.jpg";

private static DefaultHttpClient mHttpClient;


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


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

messageText = (TextView) findViewById(R.id.textView1);
messageText.setText("Uploading file path :- '/mnt/sdcard/" + uploadFileName + "'");

/************* Php script path ****************/
upLoadServerUri = "http://192.168.1.35:8080/download-files/upload.php/";

//Initializing views
buttonUpload = (Button) findViewById(R.id.button1);

//Setting clicklistener
buttonUpload.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {

Thread thread = new Thread(new Runnable() {

@Override
public void run() {

new Thread(new Runnable() {

@Override
public void run() {
runOnUiThread(new Runnable() {

@Override
public void run() {
messageText.setText("uploading started.....");
}
});

HttpURLConnection conn = null;
DataOutputStream dos = null;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 2 * 1024 * 1024;
File sourceFile = new File(uploadFilePath, uploadFileName);

if ( !sourceFile.isFile()) {


Log.e("uploadFile", "Source File not exist :"
+ uploadFilePath + "/" + uploadFileName);

runOnUiThread(new Runnable() {

@Override
public void run() {
messageText.setText("Source File not exist :"
+ uploadFilePath + "/" + uploadFileName);
}
});

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

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() {

@Override
public void run() {

String msg = "File Upload Completed.\n\n See uploaded file here : \n\n"
+ uploadFileName;

messageText.setText(msg);
Toast.makeText(SendpicActivity.this, "File Upload Complete.",
Toast.LENGTH_SHORT).show();
}
});
} else {
Toast.makeText(SendpicActivity.this, "File Upload Not Complete.",
Toast.LENGTH_SHORT).show();
}

//close the streams //
fileInputStream.close();
dos.flush();
dos.close();

}
catch (MalformedURLException ex) {

ex.printStackTrace();

runOnUiThread(new Runnable() {

@Override
public void run() {
messageText.setText("MalformedURLException Exception : check script url.");
Toast.makeText(SendpicActivity.this, "MalformedURLException",
Toast.LENGTH_SHORT).show();
}
});

Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
}
catch (Exception e) {

e.printStackTrace();

runOnUiThread(new Runnable() {

@Override
public void run() {
messageText.setText("Got Exception : see logcat ");
Toast.makeText(SendpicActivity.this, "Got Exception : see logcat ",
Toast.LENGTH_SHORT).show();
}
});
Log.e("Upload file to server Exception", "Exception : "
+ e.getMessage(), e);
}

} // End else block
}

}).start();
}
});
thread.start();
}

});
}


public void uploadUserPhoto(File image) {

try {

HttpPost httppost = new HttpPost("http://192.168.1.35:8080/download-files/upload.php");

HttpResponse result = mHttpClient.execute(httppost);
InputStream stream;
stream = result.getEntity().getContent();
String resp = inputstreamToString(stream);
Log.i("negano", "response is " + resp);
}
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;
}
}

msartin
شنبه 21 مرداد 1396, 11:53 صبح
دوستان اگه کسی وارده بگه با چه دستوری عکس به سرور ارسال میشه؟؟؟؟
لطف کنید کمک کنید. خیلی بهش احتیاج دارم. ممنون

hamedg1366
یک شنبه 22 مرداد 1396, 11:33 صبح
توی فایل Build.gradle در بلاک android هم این خط رو قرار بدید:


useLibrary 'org.apache.http.legacy'


توی فایل Build.gradle در بلاک dependencies این خط رو قرار بدید:


compile 'dev.dworks.libs:volleyplus:+'
compile 'com.squareup.okhttp3:okhttp:3.4.1'





کلاس OkHttpStack:


public class OkHttpStack implements HttpStack {

private final OkHttpClient mClient;

public OkHttpStack(OkHttpClient client) {
this.mClient = client;
}

@Override
public HttpResponse performRequest(Request<?> request,
Map<String, String> additionalHeaders) throws IOException,
AuthFailureError {

okhttp3.Request.Builder okHttpRequestBuilder = new okhttp3.Request.Builder();
okHttpRequestBuilder.url(request.getUrl());

Map<String, String> headers = request.getHeaders();
for (final String name : headers.keySet()) {
okHttpRequestBuilder.addHeader(name, headers.get(name));
}
for (final String name : additionalHeaders.keySet()) {
okHttpRequestBuilder.addHeader(name, additionalHeaders.get(name));
}

setConnectionParametersForRequest(okHttpRequestBui lder, request);

okhttp3.Request okHttpRequest = okHttpRequestBuilder.build();
Call okHttpCall = mClient.newCall(okHttpRequest);
Response okHttpResponse = okHttpCall.execute();

StatusLine responseStatus = new BasicStatusLine(
parseProtocol(okHttpResponse.protocol()),
okHttpResponse.code(), okHttpResponse.message());
BasicHttpResponse response = new BasicHttpResponse(responseStatus);
response.setEntity(entityFromOkHttpResponse(okHttp Response));

Headers responseHeaders = okHttpResponse.headers();
for (int i = 0, len = responseHeaders.size(); i < len; i++) {
final String name = responseHeaders.name(i), value = responseHeaders
.value(i);
if (name != null) {
response.addHeader(new BasicHeader(name, value));
}
}

return response;
}

private static HttpEntity entityFromOkHttpResponse(Response r)
throws IOException {
BasicHttpEntity entity = new BasicHttpEntity();
ResponseBody body = r.body();

entity.setContent(body.byteStream());
entity.setContentLength(body.contentLength());
entity.setContentEncoding(r.header("Content-Encoding"));

if (body.contentType() != null) {
entity.setContentType(body.contentType().type());
}
return entity;
}

@SuppressWarnings("deprecation")
private static void setConnectionParametersForRequest(
okhttp3.Request.Builder builder, Request<?> request)
throws IOException, AuthFailureError {
switch (request.getMethod()) {
case Request.Method.DEPRECATED_GET_OR_POST:
// Ensure backwards compatibility. Volley assumes a request with a
// null body is a GET.
byte[] postBody = request.getPostBody();
if (postBody != null) {
builder.post(RequestBody.create(
MediaType.parse(request.getPostBodyContentType()),
postBody));
}
break;
case Request.Method.GET:
builder.get();
break;
case Request.Method.DELETE:
builder.delete();
break;
case Request.Method.POST:
builder.post(createRequestBody(request));
break;
case Request.Method.PUT:
builder.put(createRequestBody(request));
break;
case Request.Method.HEAD:
builder.head();
break;
case Request.Method.OPTIONS:
builder.method("OPTIONS", null);
break;
case Request.Method.TRACE:
builder.method("TRACE", null);
break;
case Request.Method.PATCH:
builder.patch(createRequestBody(request));
break;
default:
throw new IllegalStateException("Unknown method type.");
}
}

private static ProtocolVersion parseProtocol(final Protocol p) {
switch (p) {
case HTTP_1_0:
return new ProtocolVersion("HTTP", 1, 0);
case HTTP_1_1:
return new ProtocolVersion("HTTP", 1, 1);
case SPDY_3:
return new ProtocolVersion("SPDY", 3, 1);
case HTTP_2:
return new ProtocolVersion("HTTP", 2, 0);
}

throw new IllegalAccessError("Unkwown protocol");
}

private static RequestBody createRequestBody(Request r)
throws AuthFailureError {
if (r instanceof JsonRequest || r instanceof StringRequest) {
final byte[] body = r.getBody();
if (body == null)
return null;

return RequestBody
.create(MediaType.parse(r.getBodyContentType()), body);
} else if (r instanceof MultiPartRequest) {
MultiPartRequest mlpRequest = (MultiPartRequest) r;
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);

if (mlpRequest.getMultipartParams() != null && !mlpRequest.getMultipartParams().isEmpty()) {
for (Object key : mlpRequest.getMultipartParams().keySet()) {
MultiPartRequest.MultiPartParam p = (MultiPartRequest.MultiPartParam) mlpRequest.getMultipartParams().get(key);
Log.w("param", key + ":" + p.value);
builder.addFormDataPart(key.toString(), p.value);
}
}

if (mlpRequest.getFilesToUpload() != null && !mlpRequest.getFilesToUpload().isEmpty()) {
final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
for (Object key :
mlpRequest.getFilesToUpload().keySet()) {
Log.w("fileParam", key + ":" + mlpRequest.getFilesToUpload().get(key).toString()) ;

File file = new File(mlpRequest.getFilesToUpload().get(key).toStri ng());
builder.addFormDataPart(key.toString(), file.getName(),
RequestBody.create(MEDIA_TYPE_PNG, file));
}
}
return builder.build();
}
return null;
}

}




کلاس MyApplication:


public class MyApplication extends Application {


private static MyApplication mInstance;
private RequestQueue mRequestQueue;
public static OkHttpClient client;

@Override
public void onCreate() {
super.onCreate();
mInstance = this;
initOKHTTPClient(this);
}


private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
okhttp3.Request originalRequest = chain.request();
String cacheHeaderValue = isOnline() ? "public, max-age=2419200"
: "public, only-if-cached, max-stale=2419200";

okhttp3.Request request = originalRequest.newBuilder().build();
Response response = chain.proceed(request);
return response.newBuilder().removeHeader("Pragma")
.removeHeader("Cache-Control")
.header("Cache-Control", cacheHeaderValue).build();

}
};

public static void initOKHTTPClient(Context context) {
Log.i("ExternalCacheDir", context.getExternalCacheDir() + "");
Cache cache = new Cache(context.getExternalCacheDir(), 1024 * 1024 * 30);

client = new OkHttpClient.Builder().retryOnConnectionFailure(tr ue)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.addNetworkInterceptor(REWRITE_CACHE_CONTROL_INTER CEPTOR)
.addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
// .addNetworkInterceptor(RETRY_INTERCEPTOR)
// .addInterceptor(RETRY_INTERCEPTOR)
.cache(cache).build();

}

public static boolean isOnline() {
ConnectivityManager cm = (ConnectivityManager) mInstance.getSystemService(Context.CONNECTIVITY_SE RVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return netInfo != null && netInfo.isConnectedOrConnecting();
}

public static synchronized MyApplication getInstance() {
return mInstance;
}

public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(getApplicationContext(),
new OkHttpStack(client));
}
return mRequestQueue;
}


public <T> void addToRequestQueue(Request<T> req) {
getRequestQueue().add(req);
}

public void cancelPendingRequests(Object tag) {
if (mRequestQueue != null) {
mRequestQueue.cancelAll(tag);
}
}

}

hamedg1366
یک شنبه 22 مرداد 1396, 11:36 صبح
همیننطور میتونید از کتابخونه VolleyPlus برای ارسال فایل به سرور استفاده کنید.

موفق باشید

msartin
سه شنبه 24 مرداد 1396, 00:35 صبح
با تشکر از زحمات گرانقدر شما دوست عزیز
ولی من برناممو توی ایکلیپس نوشتم و فکر میکنم ایکلیپس گریدل نداره.
به هر حال امروز یه کد گیر آوردم که با کمی تغییرات خوشبختانه جواب گرفتم.
برای همه میزارم شاید به دردشون بخوره :



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 = 5 * 1024 * 1024;
File selectedFile = new File(selectedFilePath);

String[] parts = selectedFilePath.split("/");
final String fileName = parts[parts.length - 1];

if ( !selectedFile.isFile()) {

runOnUiThread(new Runnable() {

@Override
public void run() {
messageText.setText("Source File Doesn't Exist: " + selectedFilePath);
}
});
return 0;
} else {
try {
FileInputStream fileInputStream = new FileInputStream(selectedFile);
URL url = new URL(upLoadServerUri);
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() {
messageText.setText("File Upload completed.\n\n You can see the uploaded file here: \n\n" + "http://192.168.1.35:8080/download-files/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(SendpicActivity.this, "File Not Found", Toast.LENGTH_SHORT).show();
}
});
}
catch (MalformedURLException e) {
e.printStackTrace();
Toast.makeText(SendpicActivity.this, "URL error!", Toast.LENGTH_SHORT).show();

}
catch (IOException e) {
e.printStackTrace();
Toast.makeText(SendpicActivity.this, "Cannot Read/Write File!", Toast.LENGTH_SHORT).show();
}
return serverResponseCode;
}

}