Как передать изображение из Android в мой API и сохранить его в папке? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть приложение, которое делает фотографию, и эта фотография отправляется в мой API. В моем API я хочу сохранить изображение, которое было отправлено в папку.

APP (Kotlin): код, относящийся к захваченному изображению

 private fun openCamera() {
    initData()
    val values = ContentValues()
    values.put(MediaStore.Images.Media.TITLE, "New Picture")
    values.put(MediaStore.Images.Media.DESCRIPTION, "From the camera")
    image_uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)
    //camera intent
    val cameraI = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    cameraI.putExtra(MediaStore.EXTRA_OUTPUT, image_uri)
    startActivityForResult(cameraI, Image_capture_code)
    //stop bussula
}


@SuppressLint("MissingSuperCall")
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    //called when image was captured from camea itent

    if (resultCode == Activity.RESULT_OK) {
        //set image captured to image view
        image_view.setImageURI(image_uri)
        //stop bussula
    }

}

Вот класс, который имеет все атрибуты, которые отправляются в API. Изображение теперь считается строкой. То же самое происходит в модели API

 data class Ocorrencias
(
@SerializedName("Dispositivo")
var Dispositivo : String,
@SerializedName("DataOcorrencia")
var DataOcorrencia : String,
@SerializedName("Latitude")
var Latitude : String,
@SerializedName("Longitude")
var Longitude : String,
@SerializedName("Azimute")
var Azimute : String,
@SerializedName("Fotografia")
var Fotografia : String,
@SerializedName("Estado")
var Estado : String
)

API: контроллер, который получает изображение и добавляет данные в базу данных (POST):

   [HttpPost]
    public async Task<IActionResult> PostOcorrencias([FromBody] Ocorrencias ocorrencia, IFormFile UploadImag)
    {
        ocorrencia.DataOcorrencia = DateTime.Now;

        if (ocorrencia.Dispositivo == null)
        {
            return BadRequest(ModelState);
        }
        else
        {
            if (ocorrencia.Latitude == null)
            {
                return BadRequest(ModelState);
            }
            else
            {
                if (ocorrencia.Longitude == null)
                {
                    return BadRequest(ModelState);
                }
                else
                {
                    if (ocorrencia.Azimute == null)
                    {
                        return BadRequest(ModelState);
                    }
                    else
                    {
                        //processar a fotografia
                        //ocorrencia.Fotografia = "(nome fotografia)";

                        if (UploadImag == null) {
                           return BadRequest(ModelState);
                        }
                        else {
                           if (UploadImag.ContentType == "image/jpeg" ||
                               UploadImag.ContentType == "image/png") {
                              string caminho = "";
                              string extensao = Path.GetExtension(UploadImag.FileName).ToLower();
                              Guid g;
                              g = Guid.NewGuid();
                              string nome = DateTime.Now.ToString("yyyyMMdd_HHmmss_") + g.ToString() + extensao;
                              caminho = Path.Combine(environment.WebRootPath, "imagensFogos", nome);
                              ocorrencia.Fotografia = nome;
                              // Cria o ficheiro no sistema
                              using (var stream = new FileStream(caminho, FileMode.Create)) {
                                 await UploadImag.CopyToAsync(stream);
                              }
                           }
                           else {
                              // o que vai ser feito se a imagem não for png ou jpeg?
                           }
                        }
                    }
                }
            }
        }

        // a 'ocorrencia' é boa...
        _context.Ocorrencias.Add(ocorrencia);

        await _context.SaveChangesAsync();



        /// depois, teremos de determinar se ha, ou nao, ignicao
        /// neste momento, vamos assumir q ha sempre, e q a ocorrencia e uma ignicao
        /// portanto:
        ///    - escrever na bd a ignicao
        ///    - invocar o SignalR pra atualizar os browsers

        //todos os browsers abertos são sincronizados - SignalR
        await hubContext.Clients.All.SendAsync("RedesignMap");



        return CreatedAtAction("GetOcorrencias", new { id = ocorrencia.Id }, ocorrencia);
    }

Я хочу сохранить изображение, полученное в папку с именем imagensFogos, которая находится в проекте. Есть ли уроки, как это сделать, чтобы иметь общее представление?

1 Ответ

0 голосов
/ 14 апреля 2020

Этот код может помочь-

// Retrofit API
@POST("upload-images")
fun uploadImage(@Body body: RequestBody): Call<ResponseBody>

// When using the api
val imageBody = RequestBody.create(MediaType.parse("image/png"), imageBytes)
val body = MultipartBody.Builder().apply {
                setType(MultipartBody.FORM)
                addFormDataPart("property1", property1)
                addFormDataPart("property2", property2)
                addFormDataPart("property3", property3)
                addFormDataPart("image", "file.png", imageBody)
            }.build()
API.getService().uploadImage(body).enqueue(object : Callback<ResponseBody> { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...