6

RESTfulファイルアップロード用の私のコード:

@Path("/upload") 
@POST 
@Consumes("multipart/form-data") 
public String post(
    @FormDataParam("part") String s, 
    @FormDataParam("part") FormDataContentDisposition d) { 
    return s + ":" + d.getFileName(); 
}

curl curl -X POST --form part=@file.txt url を使用してファイルをアップロードしようとすると

HTTP 415-Unsupported Media Type エラーが発生します。なにが問題ですか ?

4

5 に答える 5

6

これは、いくつかの理由で発生する可能性があります。その一部を絞り込むことができました。

  1. Content-Type ヘッダーが @Consumes ヘッダーによって提供されるものと一致しません。これをプロキシで確認します。

  2. FormDataParam アノテーションに関連する Jersey 1.4 で修正されたバグに遭遇しました。

  3. jersey-bundle と jersey-server などをすべて同じバイナリに含めましたが、それらは互いに競合しています。

  4. @FormDataParam の代わりに @FormParam を使用しています。

  5. @FormDataParam は、jersey-multipart および他の jersey jar と競合するため、イントロスペクション API によって認識されません。1 つの jar がバージョン 1.x の場合は、他の jar が同じバージョンであることを確認してください。jersey API コードをデバッグしているときに、jar のバージョンが統一されていない場合、これらのメソッドの注釈が (jersey のコードで) 空白になることに気付きました。REST サービスのすべてのメソッド パラメーターは、含まれている FormDataParam に関係なく、POST 要求の本文コンテンツに置き換えられます。

于 2012-08-05T16:36:39.143 に答える
6

多くの例を試した後、最終的にhttp://iambigd.blogspot.com/2011/06/java-upload-file-using-jersey.htmlで実際に機能する例を見つけます

@POST
@Path("/simpleupload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void simpleUpload(
    //@Context UriInfo ui,
    @Context HttpServletRequest request
){
    String fileRepository = "D:\\";
    if (ServletFileUpload.isMultipartContent(request)) {
    FileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    List<FileItem> items = null;
    try {
        items = upload.parseRequest(request);
    } catch (FileUploadException e) {
        e.printStackTrace();
    }
    if (items != null) {
        Iterator<FileItem> iter = items.iterator();
        while (iter.hasNext()) {
            FileItem item = iter.next();
            if (!item.isFormField() && item.getSize() > 0) {
            System.out.println("File is found.");
            String fileName = processFileName(item.getName());
            try {
                String savePath = fileRepository + fileName;
                System.out.println("savePath:" + savePath);
                item.write(new File(savePath));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else{
            System.out.println("getFieldName:" + item.getFieldName());
            System.out.println(item.getString());
        }
     }
   }
}
}

(servlet-api.jar、(apache) commons-oi.jar、および (apache) commons-fileupload.jar が必要です)

于 2012-08-29T17:55:36.977 に答える
0

入力ストリームで試しましたか?

のように:

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response post(
        @Context HttpServletRequest request,
        @Context HttpHeaders headers, 
        @FormDataParam("file") InputStream fileStream,

私にとってはうまくいきます。

于 2012-07-17T18:12:13.597 に答える