简体   繁体   English

无法将文件上传到带有球衣的休息 api

[英]Impossible to Upload file to rest api with jersey

My nexus exposes a REST API to upload file.我的 nexus 公开了一个 REST API 来上传文件。 With curl I can upload with this command :使用 curl 我可以使用以下命令上传:

curl -X POST " http://myurl:9086/service/rest/v1/components?repository=ebooks-store " -H "accept: application/json" -H "Content-Type: multipart/form-data" -F "raw.directory=test" -F "raw.asset1=@billet.pdf;type=application/pdf" -F "raw.asset1.filename=billet.pdf" curl -X POST " http://myurl:9086/service/rest/v1/components?repository=ebooks-store " -H "accept: application/json" -H "Content-Type: multipart/form-data" - F "raw.directory=test" -F "raw.asset1=@billet.pdf;type=application/pdf" -F "raw.asset1.filename=billet.pdf"

The documentation says that only 3 informations are required : https://help.sonatype.com/repomanager3/rest-and-integration-api/components-api文档说只需要 3 个信息: https : //help.sonatype.com/repomanager3/rest-and-integration-api/components-api

raw.directory (String = Destination for upload files (e.g. /path/to/files)) 
raw.assetN  (File   = at least one  Binary asset) 
raw.assetN.filename (String = Filename to be used for the corresponding assetN asset)

So in my java code I try to do the same thing using Jersey:所以在我的 java 代码中,我尝试使用 Jersey 做同样的事情:

FileDataBodyPart filePart = new FileDataBodyPart("file", new File("C:\\Users\\tpolo\Documents\\article.pdf"));
        FormDataMultiPart formDataMultiPart = new FormDataMultiPart();
        FormDataMultiPart multipart = (FormDataMultiPart) formDataMultiPart
                .field("format","raw")
                .field("raw.asset1.filename","article.pdf")
                .field("raw.directory", "test")
                .field("raw.asset1","article.pdf")
                .bodyPart(filePart);

        String url = nexusBaseUrl+"v1/components?repository="+repositoryName;
        WebTarget target = client.target(url);
        //Very important to do, we have to register this
        target.register(MultiPartFeature.class);
        final Response response = target.request().post(Entity.entity(multipart, multipart.getMediaType()));

        //Use response object to verify upload success

        formDataMultiPart.close();
        multipart.close();

In the log of my nexus, I have this error :在我的联系日志中,我有这个错误:

2019-08-22 21:43:32,122+0000 INFO [qtp969575574-7812] admin org.sonatype.nexus.repository.upload.internal.UploadManagerImpl - Uploading component with parameters: repository="ebooks-store" format="raw" directory="test" 2019-08-22 21:43:32,122+0000 INFO [qtp969575574-7812] admin org.sonatype.nexus.repository.upload.internal.UploadManagerImpl - Asset with parameters: file="null" filename="article.pdf" 2019-08-22 21:43:32,122+0000 INFO [qtp969575574-7812] admin org.sonatype.nexus.repository.upload.internal.UploadManagerImpl - Asset with parameters: file="article.pdf" 2019-08-22 21:43:32,124+0000 WARN [qtp969575574-7812] admin org.sonatype.nexus.siesta.internal.ValidationErrorsExceptionMapper - (ID 678c48c7-d7fc-438d-94ab-df54977fed23) Failed to map exception org.jboss.resteasy.spi.BadRequestException: RESTEASY003520: Malformed quality value. 2019-08-22 21:43:32,122+0000 INFO [qtp969575574-7812] admin org.sonatype.nexus.repository.upload.internal.UploadManagerImpl - 上传组件参数:repository="ebooks-store" format="raw" directory="test" 2019-08-22 21:43:32,122+0000 INFO [qtp969575574-7812] admin org.sonatype.nexus.repository.upload.internal.UploadManagerImpl - 带参数的资产:file="null" filename=" article.pdf" 2019-08-22 21:43:32,122+0000 INFO [qtp969575574-7812] admin org.sonatype.nexus.repository.upload.internal.UploadManagerImpl - 带有参数的资产:file="article.pdf" 201 08-22 21:43:32,124+0000 WARN [qtp969575574-7812] admin org.sonatype.nexus.siesta.internal.ValidationErrorsExceptionMapper - (ID 678c48c7-d7fc-437-d7fc-437-feasyd5234org.sonatype.nexus.siesta.internal.ValidationErrorsExceptionMapper) .spi.BadRequestException:RESTEASY003520:质量值格式错误。 at org.jboss.resteasy.core.request.QualityValue.parseAsInteger(QualityValue.java:112) ... 2019-08-22 21:43:32,125+0000 WARN [qtp969575574-7812] admin org.sonatype.nexus.siesta.internal.ValidationErrorsExceptionMapper - (ID 678c48c7-d7fc-438d-94ab-df54977fed23) Response: [500] 'FaultXO{id='678c48c7-d7fc-438d-94ab-df54977fed23', message='org.jboss.resteasy.spi.BadRequestException: RESTEASY003520: Malformed quality value.'}';在 org.jboss.resteasy.core.request.QualityValue.parseAsInteger(QualityValue.java:112) ... 2019-08-22 21:43:32,125+0000 WARN [qtp969575574-7812] admin org.sonatype.nexus .internal.ValidationErrorsExceptionMapper - (ID 678c48c7-d7fc-438d-94ab-df54977fed23) 响应:[500]'FaultXO{id='678c48c7-d7fc-438d-94ab-df54977fs. BadRequestException: RESTEASY003520: 质量值格式错误。'}'; mapped from: org.sonatype.nexus.rest.ValidationErrorsException: Missing required asset field 'Filename' on '2'映射自:org.sonatype.nexus.rest.ValidationErrorsException:“2”上缺少必需的资产字段“文件名”

What did I do wrong ?我做错了什么 ? When I change raw.asset1.filename by just Filename I got当我仅通过文件名更改 raw.asset1.filename 时,我得到了

2019-08-22 21:48:51,653+0000 INFO [qtp969575574-7831] admin org.sonatype.nexus.repository.upload.internal.UploadManagerImpl - Uploading component with parameters: repository="ebooks-store" format="raw" Filename="article.pdf" directory="test" 2019-08-22 21:48:51,653+0000 INFO [qtp969575574-7831] admin org.sonatype.nexus.repository.upload.internal.UploadManagerImpl - Asset with parameters: file="null" 2019-08-22 21:48:51,653+0000 INFO [qtp969575574-7831] admin org.sonatype.nexus.repository.upload.internal.UploadManagerImpl - Asset with parameters: file="article.pdf" 2019-08-22 21:48:51,655+0000 WARN [qtp969575574-7831] admin org.sonatype.nexus.siesta.internal.ValidationErrorsExceptionMapper - (ID 2e179b6c-7c6a-486d-bb17-41a86da08103) Failed to map exception org.jboss.resteasy.spi.BadRequestException: RESTEASY003520: Malformed quality value. 2019-08-22 21:48:51,653+0000 INFO [qtp969575574-7831] admin org.sonatype.nexus.repository.upload.internal.UploadManagerImpl - 上传组件参数:repository="ebooks-store" format="raw" Filename="article.pdf" directory="test" 2019-08-22 21:48:51,653+0000 INFO [qtp969575574-7831] admin org.sonatype.nexus.repository.upload.internal.UploadManagerImpl - 带参数的资产:文件="null" 2019-08-22 21:48:51,653+0000 INFO [qtp969575574-7831] admin org.sonatype.nexus.repository.upload.internal.UploadManagerImpl - 带参数的资产:file="article.pdf" 201 08-22 21:48:51,655+0000 WARN [qtp969575574-7831] 管理员 org.sonatype.nexus.siesta.internal.ValidationErrorsExceptionMapper - (ID 2e179b6c-7c6a-486deasys1bb017.org.sonatype.nexus.siesta.internal.ValidationErrorsExceptionMapper) .spi.BadRequestException:RESTEASY003520:质量值格式错误。 message='org.jboss.resteasy.spi.BadRequestException: RESTEASY003520: Malformed quality value.'}'; message='org.jboss.resteasy.spi.BadRequestException: RESTEASY003520: 格式错误的质量值。'}'; mapped from: org.sonatype.nexus.rest.ValidationErrorsException: Unknown component field 'Filename', Missing required asset field 'Filename' on '1', Missing required asset field 'Filename' on '2', The assets 1 and 2 have identical coordinates映射自:org.sonatype.nexus.rest.ValidationErrorsException:未知组件字段“文件名”,“1”上缺少必需的资产字段“文件名”,“2”上缺少必需的资产字段“文件名”,资产 1 和 2 有相同的坐标

I really don't know what to do.我真的不知道该怎么办。

If you have a maven repo it seems that you have to use the Maven values to upload.如果您有一个 Maven 存储库,似乎您必须使用 Maven 值来上传。 Raw didn't work for me.原始对我不起作用。 But this worked with my Maven repo.但这适用于我的 Maven 存储库。


import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.core.MultivaluedMap;
import javax.xml.bind.DatatypeConverter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

class Authenticator implements ClientRequestFilter
{
    private final String user;
    private final String password;

    Authenticator(String user, String password) {
        this.user = user;
        this.password = password;
    }

    public void filter(ClientRequestContext requestContext) throws IOException {
        MultivaluedMap<String, Object> headers = requestContext.getHeaders();
        final String basicAuthentication = getBasicAuthentication();
        headers.add("Authorization", basicAuthentication);
    }

    private String getBasicAuthentication() {
        String token = this.user + ":" + this.password;
        try {
            return "BASIC " + DatatypeConverter.printBase64Binary(token.getBytes("UTF-8"));
        } catch (UnsupportedEncodingException ex) {
            throw new IllegalStateException("Cannot encode with UTF-8", ex);
        }
    }
}
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.media.multipart.FormDataBodyPart;
import org.glassfish.jersey.media.multipart.FormDataMultiPart;
import org.glassfish.jersey.media.multipart.file.FileDataBodyPart;
import org.glassfish.jersey.media.multipart.internal.MultiPartWriter;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.File;

public class NexusFacade
{
    public Response uploadFile(File file, String repository, String groupId, String artifactId, String extension, String version)
    {
        String user = "XXXXX";
        String password = "XXXXX";
        ClientConfig configuration = new ClientConfig();
        configuration.register(MultiPartWriter.class);
        Client client = ClientBuilder.newClient(configuration).register(new Authenticator(user, password));

        FormDataMultiPart multipartEntity = new FormDataMultiPart();
        multipartEntity.bodyPart(new FileDataBodyPart("maven2.asset1", file, MediaType.APPLICATION_OCTET_STREAM_TYPE));
        multipartEntity.bodyPart(new FormDataBodyPart("maven2.asset1.extension", extension, MediaType.TEXT_PLAIN_TYPE));
        multipartEntity.bodyPart(new FormDataBodyPart("maven2.groupId", groupId, MediaType.TEXT_PLAIN_TYPE));
        multipartEntity.bodyPart(new FormDataBodyPart("maven2.artifactId", artifactId, MediaType.TEXT_PLAIN_TYPE));
        multipartEntity.bodyPart(new FormDataBodyPart("maven2.version", version, MediaType.TEXT_PLAIN_TYPE));
        multipartEntity.bodyPart(new FormDataBodyPart("maven2.generate-pom", "false", MediaType.TEXT_PLAIN_TYPE));

        return client.target(baseURL)
                .path("/service/rest/v1/components")
                .queryParam("repository", repository)
                .request()
                .post(Entity.entity(multipartEntity, MediaType.MULTIPART_FORM_DATA));
    }

    private String baseURL = "http://my-nexus.localhost";
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM