Fork me on GitHub

Uploading files

Handling multipart/form-data uploads

Ninja可通过您的控制器方法直接访问文件上传. 这是通过Context对象及其两个方法完成的: context.isMultipart()以检查我们是否正在处理分段上传,而context.getFileItemIterator()可以迭代潜在文件.

通常,您呈现一个链接到将处理上载的控制器的表单. 在以下情况下,我们使用到/ upload的路由.

<form method="post" enctype="multipart/form-data" action="/upload">
    Please specify file to upload: <input type="file" name="upfile"><br />
    <input type="submit" value="submit">
</form>

请注意,您仍然可以在适当的DTO中获取其他表单值: public Result upload(Context context,MyDto formObject,@Param(" file")File file){…} .

The manual default way

然后, / uploadFinish中的控制器将处理上载:

public Result uploadFinish(Context context) throws Exception {

    // Make sure the context really is a multipart context...
    if (context.isMultipart()) {

        // This is the iterator we can use to iterate over the
        // contents of the request.
        FileItemIterator fileItemIterator = context
                .getFileItemIterator();

        while (fileItemIterator.hasNext()) {

            FileItemStream item = fileItemIterator.next();

            String name = item.getFieldName();
            InputStream stream = item.openStream();

            String contentType = item.getContentType();

            if (item.isFormField()) {

                // do something with the form field

            } else {

                // process file as input stream

            }
        }

    }
    
    // We always return ok. You don't want to do that in production ;)
    return Results.ok();

}

The integrated new way

/ uploadFinish中的控制器可以自动处理上载,并返回FileItem,InputStream或File. 使用FileItem允许访问其他属性,例如getFileName()来获取浏览器发送的原始文件名. 注意:默认情况下,文件提供程序设置为NoFileItemProvider-为了使用这种新方式,您需要按如下所述配置文件提供程序.

public Result uploadFinish(Context context, @Param("upfile") FileItem upfile) throws Exception {
}

or

public Result uploadFinish(Context context, @Param("upfile") InputStream upfile) throws Exception {
}

or

public Result uploadFinish(Context context, @Param("upfile") File upfile) throws Exception {
}

or

public Result uploadFinish(Context context) throws Exception {
    FileItem upfile = context.getParameterAsFileItem("upfile");
}

In-memory or disk based file ?

Ninja带有两个提供程序,供您在内存文件和磁盘文件之间进行选择以存储上载的内容: -MemoryFileItemProvider ,将文件字节存储到内存中-DiskFileItemProvider ,将文件内容存储到磁盘中的临时文件夹中,可以使用uploads.temp_folder忍者属性

在所有情况下,都可以使用uploads.max_file_size限制每个文件的大小,并使用uploads.max_total_size ninja属性限制所有文件的总大小.

使用磁盘库存储时,在请求结束时会自动删除上载的文件,以防止文件系统用尽. 因此,如果要保留以后使用,则必须在请求结束之前将文件复制(或移动)到其他位置.

Configure the file provider to use

Ninja让您配置文件提供程序以在不同的地方使用:-在模块中,使用绑定配置默认提供程序-在控制器类中,覆盖模块中配置的默认提供程序-在控制器方法中,覆盖类或模块提供者

默认情况下,该提供程序设置为NoFileItemProvider ,后者只是恢复为手动处理文件的方式.

要在模块中定义提供程序,只需使用绑定:

bind(FileItemProvider.class).to(MemoryFileItemProvider.class)

要在控制器类和/或方法中定义提供者,请使用注释:

@FileProvider(DiskFileItemProvider.class)
@Singleton
public class MyController {
    @FileProvider(MemoryFileItemProvider.class)
    public Result myRouteMethod() {
        // This will use the MemoryFileItemProvider defined at method level
    }
    public Result myOtherRouteMethod() {
        // This will use the DiskFileItemProvider defined at class level
    }
}

Advanced usage

Ninja使用Apache Commons-upload来实现上传功能. 因此,您也可以在以下位置参考其出色的手册以获取更多信息: http : //commons.apache.org/proper/commons-fileupload/


by  ICOPY.SITE