Tengo un problema sobre subir una imagen de mi aplicación Android a un servicio ASMX
, mi versión de Android es 7.1.1 y mi servicio fue creado con Framework 4.5.
[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public void SaveImage()
{
if (!System.IO.Directory.Exists(HttpContext.Current.Server.MapPath("~/Upload")))
{
System.IO.Directory.CreateDirectory(HttpContext.Current.Server.MapPath("~/Upload/"));
}
string path = HttpContext.Current.Server.MapPath("~/Upload/").ToString();
var Request = HttpContext.Current.Request;
if (Request.Files.Count > 0)
{
var file = Request.Files[0];
file.SaveAs(path + file.FileName);
}
}
Aplicación Android:
/**
* Created by SOPORTE on 05/12/2016.
*/
import android.app.DownloadManager;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Map;
public class upload extends AppCompatActivity implements View.OnClickListener {
private Button buttonChoose;
private Button buttonUpload;
private ImageView imageView;
private EditText editTextName;
private Bitmap bitmap;
private int PICK_IMAGE_REQUEST = 1;
private String UPLOAD_URL ="http://192.168.0.18:8086/ServicesLogistica.asmx/UploadFile";
private String KEY_IMAGE = "image";
private String KEY_NAME = "name";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_upload);
buttonChoose = (Button) findViewById(R.id.buttonChoose);
buttonUpload = (Button) findViewById(R.id.buttonUpload);
editTextName = (EditText) findViewById(R.id.editText);
imageView = (ImageView) findViewById(R.id.imageView);
buttonChoose.setOnClickListener(this);
buttonUpload.setOnClickListener(this);
}
public String getStringImage(Bitmap bmp){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] imageBytes = baos.toByteArray();
String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
return encodedImage;
}
private void uploadImage(){
//Showing the progress dialog
final ProgressDialog loading = ProgressDialog.show(this,"Uploading...","Please wait...",false,false);
StringRequest stringRequest = new StringRequest(Request.Method.POST, UPLOAD_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
//Disimissing the progress dialog
loading.dismiss();
//Showing toast message of the response
Toast.makeText(upload.this, s , Toast.LENGTH_LONG).show();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
//Dismissing the progress dialog
loading.dismiss();
//Showing toast
Toast.makeText(upload.this, volleyError.getMessage().toString(), Toast.LENGTH_LONG).show();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
//Converting Bitmap to String
String image = getStringImage(bitmap);
//Getting Image Name
String name = editTextName.getText().toString().trim();
//Creating parameters
Map<String,String> params = new Hashtable<String, String>();
//Adding parameters
params.put(KEY_IMAGE, image);
params.put(KEY_NAME, name);
//returning parameters
return params;
}
};
//Creating a Request Queue
RequestQueue requestQueue = Volley.newRequestQueue(this);
//Adding request to the queue
requestQueue.add(stringRequest);
}
private void showFileChooser() {
Intent intent = new Intent();
intent.setType("image/jpeg");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
Uri filePath = data.getData();
try {
//Getting the Bitmap from Gallery
bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
//Setting the Bitmap to ImageView
imageView.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void onClick(View v) {
if(v == buttonChoose){
showFileChooser();
}
if(v == buttonUpload){
uploadImage();
}
}
}
Я анализировал и встретился в задание ответить твой код в app присоединяя ее к услуге ASMX
, во что я нашел какие-то детали, которые он мне кажется, ты должен исправлять.
Первый состоит в том, что унифицированный указатель ресурса услуги не правильный. Услуга ASMX
возьми Веб методы как "выборы", тогда, он был бы должен оставаться следующей формы:
private String UPLOAD_URL = "http://192.168.0.18:8086/ServicesLogistica.asmx?op=SaveImage";
Где SaveImage
это выставленный метод Вашей Веб услуги.
Потом, существует различие между методом просьбы, например, в заявлении stringRequest
ты говоришь, что его будет один POST
с инструкцией Request.Method.POST
и в Веб услуге ты говоришь, что его будет один GET
с инструкцией UseHttpGet = true
. Одиноким было бы, что ты утвердил в желанный тип просьбы.
В коде услуги, ты должен иметь как определение в метод SaveImage
public void SaveImage(string image, string name)
Так как это параметры, которые будет получать метод.
Остальное, кажется, хорошо, я не был должен изменять больше ничего, что это. Я надеюсь, что он полезен.
Ты нуждаешься в том, чтобы изменить твой web.config, чтобы добавлять какие-то протоколы, которые дезактивированы из-за default, также увеличь размер файлов, которые ты можешь пересылать в твой server
<httpRuntime maxRequestLength="1048576" />
<webServices>
<protocols>
<add name="HttpSoap"/>
<add name="HttpPost"/>
<add name="HttpGet"/>
<add name="HttpPostLocalhost"/>
</protocols>
</webServices>
Код твоего приложения Android, только реализуй посредством метода POST envió url изображения.
StringRequest stringRequest = new StringRequest(Request.Method.POST, UPLOAD_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
//Disimissing the progress dialog
loading.dismiss();
//Showing toast message of the response
Toast.makeText(upload.this, s , Toast.LENGTH_LONG).show();
}
},
...
...
...
Если ты видишь в твоем приложении изображение, он, потому что ты загружаешь ее и добавляешь один ImageView
:
private void showFileChooser() {
Intent intent = new Intent();
intent.setType("image/jpeg");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
Uri filePath = data.getData();
try {
//Getting the Bitmap from Gallery
bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
//Setting the Bitmap to ImageView
imageView.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Код твоего Веба Service - C#, важное здесь состоит в том, чтобы знать, что данные и, что тип - те, которых получает твой Веб Service (было бы возможно знать посредством WSDL, не REST ли это). Хотя проблема, которая общеизвестный состоит в том, что метод не имеет определено, что он получил какую-то стоимость: SaveImage()
.
Я советую тебе, чтобы ты сначала реализовал метод, который мог бы получать изображение, увидь этот пример, где был осуществлен WebService, где ты можешь видеть, чем посредством метода UploadFile(byte[] f, string fileName)
получи один байт array содержа изображение и имя, которое она будет распределена в изображение.
http://www.c-sharpcorner.com/article/upload-any-type-of-file-through-a-C-Sharp-web-service/
В этом примере ты можешь видеть, как создавать приложение, которое посылает изображение посредством POST.