2

ローカルの Android ギャラリーからサーバーの http Tomcat に写真を送信したいと考えています。通信にはレトロフィットを使用しています。デバイスとサーバー間の接続を確立しました。プログラムはサーバー機能に入りますが、params のすべてのオブジェクトは null です。

これは、クライアント側のデバイス関数宣言です。

@Multipart
@POST("/monument/photo/upload")
void addMonumentPhoto(@Part("MonumentID") Integer monumentId,
                      @Part("name") String name,
                      @Part("subscript") String subscript,
                      @Part("photo") TypedFile photo,
                      Callback<Photo> callback);

...そしてそれが私がそれを呼ぶ方法です:

photo = _resizePhoto(new File(monument.getUriZdjecie()));
typedFile = new TypedFile("multipart/mixed", photo);
//long bytes = photo.length();

  if (photo.exists()) {
      MonumentsUtil.getApi().addMonumentPhoto(monument.getIdZabytek(),
          "podpis",
          "Main photo",
           typedFile,
           new Callback<Photo>() {
           @Override
           public void success(Photo aPhoto, Response response) {

                  monument.setUriZdjecie(aPhoto.getUri());

                  MonumentsUtil.getApi().addMonument(monument.getNazwa(),
                                            monument.getOpis(),
                                            monument.getDataPowstania(),
                                            monument.getWojewodztwo(),
                                            monument.getUriZdjecie(),
                                            monument.getMiejscowosc(),
                                            monument.getKodPocztowy(),
                                            monument.getUlica(),
                                            monument.getNrDomu(),
                                            monument.getNrLokalu(),
                                            monument.getKategoria(),
                                            monument.getLatitude(),
                                            monument.getLongitude(),
                                            new MonumentsCallback());
           }
           @Override
           public void failure(RetrofitError retrofitError) {
                 Log.e(TAG, retrofitError.getMessage());
           }
     });
}

およびサーバーのメソッド:

@RequestMapping(value = "/monument/photo/upload")
public
@ResponseBody
Photo requestMonumentPhotoAdd(@RequestParam(value = "MonumentID", required = false) Integer monumentId,
                              @RequestParam(value = "name", required = false) String name,
                              @RequestParam(value = "subscript", required = false) String subscript,
                              @RequestParam(value = "photo", required = false) MultipartFile file,
                              HttpServletRequest request) {

    Photo photo = new Photo();
    if (monumentId != null)
        photo.setIdZabytek(monumentId);
    photo.setUri(URL + "/images/" + name);
    photo.setPodpis(subscript);
    photo = monumentsRepo.addPhoto(photo);
    String filePath = "D:\\Projects\\Images\\" + monumentId + "_" + photo.getIdZjecia();

    if (file != null) {
        if (!file.isEmpty()) {
            try {
                byte[] bytes = file.getBytes();
                BufferedOutputStream stream =
                        new BufferedOutputStream(new FileOutputStream(new File(filePath)));
                stream.write(bytes);
                stream.close();
                photo.setUri(filePath);
                monumentsRepo.updatePhoto(photo);
                return photo;
            } catch (Exception e) {
                return null;
            }
        } else {
            return null;
        }
    }
    else {
        return null;
    }
}

サーバーメソッドに入った後のすべてのオブジェクトがnullである理由を説明してくれる人はいますか? メソッドが不適切に記述されているか、TypedFile の MIME フィールドが不適切に選択されている可能性がありますが、「マルチパート/混合」MIME タイプは、メッセージにさまざまなタイプのオブジェクトが含まれるメッセージ用であると読みました。全然わからないのでアドバイスいただけると助かります。

4

2 に答える 2

0

私も同様の問題を抱えており、数時間試した後、最終的にリモートサーバーへの画像アップロード機能を構築しました。

画像をアップロードするには、API を適切に作成し、画像を適切に渡す必要があります。

これはうまくいくはずです:

Retrofit クライアントでは、次のようにイメージを設定する必要があります。

String photoName = "20150219_222813.jpg";
File photo = new File(photoName );
TypedFile typedImage = new TypedFile("application/octet-stream", photo);


RetrofitClient.uploadImage(typedImage, new retrofit.Callback<Photo>() {

            @Override
            public void success(Photo photo, Response response) {
                Log.d("SUCCESS ", "SUCCESS RETURN " + response);
            }

            @Override
            public void failure(RetrofitError error) {

            }
        });

API セットアップ:

@Multipart
@POST("/")
void uploadImage(@Part("file") TypedFile file, Callback<Photo> callback);

イメージを処理するためのリモート サーバー側の PHP コード:

........
$pic = 'uploaded_images/' . $imagename . '.jpg';
if (!move_uploaded_file($_FILES['file']['tmp_name'], $pic)) {
   echo "posted";
}
.........

それが誰かを助けるなら、私を認識してください..どうもありがとう..

于 2015-03-04T16:17:14.253 に答える