当前位置: 首页 > 知识库问答 >
问题:

无法使用jersey将文件上载到rest api

张浩阔
2023-03-14

我的nexus公开了一个REST API来上传文件。通过curl,我可以使用以下命令上传:

卷曲-X柱“http://myurl:9086/service/rest/v1/components?repository=ebooks-store“-H”accept:application/json“-H”内容类型:multipart/form data“-F”raw。目录=测试“-F”原始。asset1=@bump。pdf;类型=应用程序/pdf“-F”原始。资产1。文件名=钢坯。pdf“

留档说只需要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)

所以在我的java代码中,我试图用泽西做同样的事情:

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();

在我的nexus日志中,我有这个错误:

2019-08-22 21:43:32122 0000信息[qtp969575574-7812]管理组织。索纳型。关系存储库。上载内部的UploadManagerImpl-上传带有参数的组件:repository=“ebooks store”format=“raw”directory=“test”2019-08-22 21:43:32122 0000信息[qtp969575574-7812]管理组织。索纳型。关系存储库。上载内部的UploadManagerImpl-参数为:file=“null”filename=“article.pdf”2019-08-22 21:43:32122 0000信息[qtp969575574-7812]管理组织的资产。索纳型。关系存储库。上载内部的UploadManagerImpl-Asset with parameters:file=“article.pdf”2019-08-22 21:43:32124 0000 WARN[qtp969575574-7812]admin org。索纳型。关系午睡。内部的ValidationErrorExceptionMapper-(ID 678c48c7-d7fc-438d-94ab-df54977fed23)未能映射异常组织。jboss。放松点。spi。BadRequestException:RESTEASY003520:质量值格式错误。在org。jboss。放松点。果心要求质量价值。parseAsInteger(QualityValue.java:112)。。。2019-08-22 21:43:32125 0000警告[qtp969575574-7812]管理组织。索纳型。关系午睡。内部的ValidationErrorExceptionMapper-(ID 678c48c7-d7fc-438d-94ab-df54977fed23)响应:[500]“FaultXO{ID='678c48c7-d7fc-438d-94ab-df54977fed23',消息='org.jboss.resteasy.spi.BadRequestException:RESTEASY003520:格式错误的质量值”。';映射自:org。索纳型。关系RestValidationErrorException:在“2”上缺少必需的资产字段“Filename”

我做错了什么?当我变生的时候。资产1。文件名就是我得到的文件名

2019-08-22 21:48:51653 0000信息[qtp969575574-7831]管理组织。索纳型。关系存储库。上载内部的UploadManagerImpl-上传带有参数的组件:repository=“ebooks store”format=“raw”Filename=“article.pdf”directory=“test”2019-08-22 21:48:51653 0000信息[qtp969575574-7831]管理组织。索纳型。关系存储库。上载内部的UploadManagerImpl-带有参数的资产:file=“null”2019-08-22 21:48:51653 0000信息[qtp969575574-7831]管理组织。索纳型。关系存储库。上载内部的UploadManagerImpl-Asset with parameters:file=“article.pdf”2019-08-22 21:48:51655 0000 WARN[qtp969575574-7831]admin org。索纳型。关系午睡。内部的ValidationErrorExceptionMapper-(ID 2e179b6c-7c6a-486d-bb17-41a86da08103)未能映射异常组织。jboss。放松点。spi。BadRequestException:RESTEASY003520:质量值格式错误。消息组织。jboss。放松点。spi。BadRequestException:RESTEASY003520:格式错误的质量值。“}”;映射自:org。索纳型。关系RestValidationErrorException:未知组件字段“Filename”,缺少“1”上的必需资产字段“Filename”,缺少“2”上的必需资产字段“Filename”,资产1和2具有相同的坐标

我真的不知道该怎么办。

共有1个答案

孙才捷
2023-03-14

如果你有一个maven回购协议,你似乎必须使用maven值来上传。生的对我不管用。但这对我的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";
}
 类似资料:
  • 开始时,我可以通过以下curl请求上传我的文件: curl-u“admin:admin”-X POSThttp://myurlu:9086/service/rest/v1/components?repository=ebooks-store“-H”accept:application/json“-H”内容类型:multipart/form data“-F”raw。目录=测试“-F”原始。asset

  • 我使用这个网络服务上传一个文件使用泽西 //省省吧 //将上传的文件保存到新位置 当我执行我的代码我得到一个405错误!对这个问题有什么建议吗?

  • 附注。当我使用@requestParam(Name=“file”,required=true)MultipartFile文件时,我得到错误POST http://localhost:8080/single-file 400(错误请求),看起来spring无法从FormData获得MultipartFile文件。在后端,我没有得到任何错误,只有MultipartFile文件=null

  • 在构建代码之后,我无法将构建工件上载到aws s3 bucket。 下面是我从jenkins那里得到的控制台输出片段。 错误:上传文件失败com.amazonaws.services.s3.model.Amazon S3异常:桶在这个区域:空。请使用此区域重试请求(服务:Amazon S3;状态代码:301;错误代码:PermanentReDirect;请求ID:EDD73B3CC84C0AF6)

  • 根据SkyDrive api(http://msdn.microsoft.com/en-us/library/live/hh826531.aspx#uploading_files),我在帖子请求的正文中以字节[]传递图像的内容。文件创建发生在skyDrive服务器上,但当我在skyDrive中打开它时,它说“文件应用程序被损坏或损坏”。 请求的正文 --A300x内容处理:表单数据;name=“f

  • 我尝试使用C#将文件上传到FTP服务器。文件已上传,但字节为零。