File Upload and Download 文件上传、下载

    我们在 目录下创建 FileResource 资源类,在里面写两个路径,filepath 是文件下载路径,serverLocation 是文件上传的目录。当然 “小柳哥.txt” 这个文件是必须存在的。

    在 FileResource 资源类中添加 文件下载的代码如下:

    1. @GET
    2. @Path("download")
    3. @Consumes(MediaType.APPLICATION_JSON)
    4. @Produces(MediaType.APPLICATION_OCTET_STREAM)
    5. public Response downloadFile() {
    6. File file = new File(filepath);
    7. if (file.isFile() && file.exists()) {
    8. String mt = new MimetypesFileTypeMap().getContentType(file);
    9. String fileName = file.getName();
    10. return Response
    11. .ok(file, mt)
    12. .header("Content-disposition",
    13. "attachment;filename=" + fileName)
    14. .header("ragma", "No-cache")
    15. .header("Cache-Control", "no-cache").build();
    16. } else {
    17. return Response.status(Response.Status.NOT_FOUND)
    18. .entity("下载失败,未找到该文件").build();
    19. }
    20. }

    @Produces(MediaType.APPLICATION_OCTET_STREAM) 这里就说明了,文件将会以文件流的形式返回给客户端。

    下载客户端

    在 index.jsp 里面添加

    1. <p><a href="webapi/files/download">Download</a>

    好了,代码写完,我们启动项目测试下。点击 “Download”, 此时,发现文件的名称不见了。

    这是因为系统解析不了编码导致的。需要将文件名称编码做下转化即可:

    11. File Upload and Download 文件上传、下载 - 图2

    OK ,下载程序写完。

    处理大数量传参下载的问题

    有时难免要传递的参数较大,GET 请求难以胜任,只能用 POST 来请求下载。

    下面例子就是用一个隐藏的 Form 表单来传参进行文件的下载:

    1. var form=$("<form>");//定义一个form表单
    2. form.attr("style","display:none");
    3. form.attr("target","");
    4. form.attr("method","post");
    5. form.attr("action",exportUrl);
    6. var input1=$("<input>");
    7. input1.attr("type","hidden");
    8. input1.attr("value",fileName);
    9. var input2=$("<input>");
    10. input2.attr("type","hidden");
    11. input2.attr("name","columns");
    12. input2.attr("value",JSON.stringify(columns));
    13. var input3=$("<input>");
    14. input3.attr("type","hidden");
    15. input3.attr("name","rowsData");
    16. input3.attr("value",JSON.stringify(rows));
    17. $("body").append(form);//将表单放置在页面中
    18. form.append(input1);
    19. form.append(input2);
    20. form.append(input3);
    21. form.submit().remove();;//表单提交并

    其中,input 就是用来传递参数的。input 的 name 属性是参数的名称,value 属性是参数的值。

    服务端要做如下的处理:

    1. @POST
    2. @Path("excel/easyui-datagird")
    3. @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    4. @Produces(MediaType.APPLICATION_OCTET_STREAM)
    5. public Response jsonToExcle(@FormParam("fileName") String fileName,
    6. @FormParam("columns") String columns,
    7. @FormParam("rowsData") String rowsData) {
    8. //这里是处理的业务逻辑代码
    9. }

    添加 jersey-media-multipart 到 pom.xml

    并在 RestApplication 里面注册 MultiPart

    1. public class RestApplication extends ResourceConfig {
    2. public RestApplication() {
    3. //资源类所在的包路径
    4. packages("com.waylau.rest.resource");
    5. register(MultiPartFeature.class);
    6. }
    7. }

    上传服务端

    在 FileResource 资源类中添加 文件下载的代码如下:

    1. @Path("upload")
    2. @Consumes(MediaType.MULTIPART_FORM_DATA)
    3. @Produces("application/json")
    4. public Response uploadFile(
    5. @FormDataParam("file") InputStream fileInputStream,
    6. @FormDataParam("file") FormDataContentDisposition contentDispositionHeader)
    7. throws IOException {
    8. String fileName = contentDispositionHeader.getFileName();
    9. File file = new File(serverLocation + fileName);
    10. File parent = file.getParentFile();
    11. //判断目录是否存在,不在创建
    12. if(parent!=null&&!parent.exists()){
    13. parent.mkdirs();
    14. }
    15. file.createNewFile();
    16. OutputStream outpuStream = new FileOutputStream(file);
    17. int read = 0;
    18. byte[] bytes = new byte[1024];
    19. while ((read = fileInputStream.read(bytes)) != -1) {
    20. outpuStream.write(bytes, 0, read);
    21. }
    22. outpuStream.flush();
    23. outpuStream.close();
    24. fileInputStream.close();
    25. return Response.status(Response.Status.OK)
    26. .entity("Upload Success!").build();

    在 index.jsp 写一个上传的 Form 表单

    测试

    选择文件,点击“Upload It”,上传成功

    11. File Upload and Download 文件上传、下载 - 图4

    • 突破 URL 传值限制