【问题标题】:Dropwizard file uploadDropwizard文件上传
【发布时间】:2014-03-20 06:58:06
【问题描述】:

我必须从我的网站上传一个文件,但 cnt 似乎可以使用放置向导。

这是我网站上的表格。

   <form enctype="multipart/form-data" method="POST" action="UploadFile">
     <input type="file" id="fileUpload" name="file"/>
     <input type="hidden" id="fileName" name="fileName"/>
     <input type="submit" value="Upload"/>
   </form>

我将如何在后端接收文件?

解决办法是

    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFile(
        @FormDataParam("file") final InputStream fileInputStream,
        @FormDataParam("file") final FormDataContentDisposition contentDispositionHeader) {


    String filePath = uploadLocation + newFileName;
    saveFile(fileInputStream, filePath);
    String output = "File can be downloaded from the following location : " + filePath;

    return Response.status(200).entity(output).build();

}

private void saveFile(InputStream uploadedInputStream,
        String serverLocation) {
    try {
            OutputStream outputStream = new FileOutputStream(new      File(serverLocation));
            int read = 0;
            byte[] bytes = new byte[1024];

            outputStream = new FileOutputStream(new File(serverLocation));
            while ((read = uploadedInputStream.read(bytes)) != -1) {
                outputStream.write(bytes, 0, read);
            }
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }   

【问题讨论】:

  • 你可以回答你自己的问题你知道吗?事实上,你应该回答你自己的问题,而不是把答案放在问题中
  • 为什么要分配给 outputStream 两次?

标签: dropwizard


【解决方案1】:

您可以使用 nio 以更少的行数保存到服务器

java.nio.file.Path outputPath = FileSystems.getDefault().getPath(<upload-folder-on-server>, fileName);
Files.copy(fileInputStream, outputPath);

另外,如果您使用的是 0.7.0-rc2,您的 pom.xml 中将需要此依赖项

<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-multipart</artifactId>
<version>1.18</version>
</dependency>

【讨论】:

  • Dropwizard 0.8.0 后依赖为:org.glassfish.jersey.media, artifactId: jersey-media-multipart
【解决方案2】:

使用 Dropwizard 0.9.2 您必须添加依赖项:

<dependency>
    <groupId>io.dropwizard</groupId>
    <artifactId>dropwizard-forms</artifactId>
    <version>${dropwizard.version}</version>
    <type>pom</type>
</dependency>

以及注册多部分功能:

    environment.jersey().register(MultiPartFeature.class);

【讨论】:

  • 我正在使用与您提到的相同版本的 dropwizard,这种方法给了我 400 错误请求错误。参数与问题中所述的参数相同。
  • 我忘记注册多部分要素类了!谢谢。
【解决方案3】:

确保将 dropwizard-forms 依赖项添加到 pom.xml

<dependency>
    <groupId>io.dropwizard</groupId>
    <artifactId>dropwizard-forms</artifactId>
    <version>${dropwizard.version}</version>
    <type>pom</type>
</dependency>

您的资源看起来不错,无论如何我已经上传了一个使用 Dropwizard 上传文件的示例项目 - https://github.com/juanpabloprado/dw-multipart

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(
        @FormDataParam("file") InputStream uploadedInputStream,
        @FormDataParam("file") FormDataContentDisposition fileDetail) throws MessagingException, IOException {

    String uploadedFileLocation = "C:/Users/Juan/Pictures/uploads/" + fileDetail.getFileName();

    // save it
    writeToFile(uploadedInputStream, uploadedFileLocation);
    String output = "File uploaded to : " + uploadedFileLocation;
    return Response.ok(output).build();
}

// save uploaded file to new location
private void writeToFile(InputStream uploadedInputStream, String uploadedFileLocation) throws IOException {
    int read;
    final int BUFFER_LENGTH = 1024;
    final byte[] buffer = new byte[BUFFER_LENGTH];
    OutputStream out = new FileOutputStream(new File(uploadedFileLocation));
    while ((read = uploadedInputStream.read(buffer)) != -1) {
        out.write(buffer, 0, read);
    }
    out.flush();
    out.close();
}

【讨论】:

    猜你喜欢
    • 2017-08-27
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多