Как загрузить несколько изображений с Android с помощью модернизации и .net ядра? - PullRequest
0 голосов
/ 27 марта 2019

Я кодирую, чтобы загрузить несколько изображений с Android на сервер, и одно изображение может загружаться правильно, в то время как несколько изображений не могут.

Мне нужна помощь по поводу моего кода.Сервер от ядра C # .NET и Android от дооснащения + rxjava.

Серверная часть (ядро C # .net)

    [HttpPost]
    public async Task<IActionResult> UploadFile(IFormFile file)
    {
        BaseEntity<string> be = new BaseEntity<string>();

        if (file == null || file.Length == 0)
        {
            be.code = "1";
            be.message = "no file";
            be.data = "";
            return Ok(JsonConvert.SerializeObject(be));
        }

        // change file name with its extension
        var fileName = Guid.NewGuid().ToString() +
            System.IO.Path.GetExtension(file.FileName);


        var path = Path.Combine(
                      Directory.GetCurrentDirectory(), "wwwroot/userImgs",
                      fileName);

        using (var stream = new FileStream(path, FileMode.Create))
        {
            await file.CopyToAsync(stream);
        }

        be.code = "0";
        be.message = "success";
        be.data = fileName.ToString();
        return Ok(be);
    }


    [HttpPost]
    public async Task<IActionResult> UploadFiles(List<IFormFile> files)
    {
        BaseEntity<List<string>> be = new BaseEntity<List<string>>();

        if (files == null || files.Count == 0)
        {
            be.code = "1";
            be.message = "files shows no content";
            be.data = null;
            return Ok(JsonConvert.SerializeObject(be));
        }

        List<string> paths = new List<string>();

        foreach (var file in files)
        {
            if (file.Length > 0)
            {
                var path = Path.Combine(
                       Directory.GetCurrentDirectory(), "wwwroot/userImgs",
                       file.FileName);

                using (var stream = new FileStream(path, FileMode.Create))
                {
                    await file.CopyToAsync(stream);
                }
                paths.Add(file.FileName);
            }
        }
        be.code = "1";
        be.message = "success";
        be.data = paths;
        return Ok(JsonConvert.SerializeObject(be));
    }

Сторона Android:

Web Apis:

@Multipart
@POST("Upload/UploadFile")
Observable<BaseEntity<String>> UploadFile(@Part MultipartBody.Part file);

@Multipart
@POST("Upload/UploadFiles")
Observable<BaseEntity<String>> UploadFiles(@Part() List<MultipartBody.Part> files);

Вызов:

ArrayList<MultipartBody.Part> files=new ArrayList<>();

            if(list.get(p).localImgURLs.size()!=0)
            {
                for (String url:list.get(p).localImgURLs
                ) {
                    File file = new File(url);

                    RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);

                    MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile);

                    files.add(body);
                }
            }



            Api.getInstance().UploadFiles(files)
                    .subscribeOn(Schedulers.io())
                    .doOnSubscribe(new Consumer<Disposable>() {
                        @Override
                        public void accept(@io.reactivex.annotations.NonNull Disposable disposable) throws Exception {
                            ((ExecCheckActivity)mContext).startWait();
                        }
                    })
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Consumer<BaseEntity<String>>() {
                        @Override
                        public void accept(@io.reactivex.annotations.NonNull BaseEntity<String> be) throws Exception {
                            ((ExecCheckActivity)mContext).stopWait();
                            MyApplication.setResultToToast(be.getMessage());
                        }
                    }, new Consumer<Throwable>() {
                        @Override
                        public void accept(@io.reactivex.annotations.NonNull Throwable throwable) throws Exception {
                            ((ExecCheckActivity)mContext).stopWait();
                            ExceptionHelper.handleException(throwable);
                        }
                    });

Проблема в том, когда я вызываю Api.getInstance (). UploadFile (files.get (0)) это будет работать, и когда я вызываю Api.getInstance() .UploadFiles (файлы) это не будет.

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Я понял это.

MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile);

следует изменить на:

MultipartBody.Part body = MultipartBody.Part.createFormData("files", file.getName(), requestFile);
0 голосов
/ 27 марта 2019

Ваш сервис должен получить массив файлов, просто измените свой внутренний код

public async Task<IActionResult> UploadFile(IFormFile[] file)
...