¿Cómo puedo subir una imagen de Android a un servicio ASMX?

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();
        }
    }
}
8
задан 05.12.2016, 23:39
3 ответа

Я анализировал и встретился в задание ответить твой код в 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)

Так как это параметры, которые будет получать метод.

Остальное, кажется, хорошо, я не был должен изменять больше ничего, что это. Я надеюсь, что он полезен.

4
ответ дан 24.11.2019, 12:15

Ты нуждаешься в том, чтобы изменить твой web.config, чтобы добавлять какие-то протоколы, которые дезактивированы из-за default, также увеличь размер файлов, которые ты можешь пересылать в твой server

<httpRuntime maxRequestLength="1048576" />
<webServices>
    <protocols>
            <add name="HttpSoap"/>
    <add name="HttpPost"/>
    <add name="HttpGet"/> 
    <add name="HttpPostLocalhost"/>
    </protocols>
</webServices>
2
ответ дан 24.11.2019, 12:15
  • 1
    если я также это сделал, но ничто что-то будет иметь общее HttpContext. Current. Request?? – Naxin IA 05.12.2016, 23:31
  • 2
    perdó n из-за ожидания, не, если уже ты решил проблему, но сейчас видя код ты получаешь в формате json пробуй оставляя одинокого [WebMethod] – Humberto Montes De Oca Lobera 06.12.2016, 17:13
  • 3
    также я это попробовал humberto, но совсем не – Naxin IA 06.12.2016, 17:28
  • 4
    уже ты попробовал посылать файл с компьютера – Humberto Montes De Oca Lobera 06.12.2016, 17:36
  • 5
    если и пошли нормально используйте rest я утешил chrome – Naxin IA 06.12.2016, 17:40

Код твоего приложения 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.

C# пересылать файл в сервер.

2
ответ дан 24.11.2019, 12:15

Теги

Похожие вопросы