REST 文件上傳、下載

2018-08-08 14:32 更新

正如其他管理系統(tǒng)一般,REST也需要實(shí)現(xiàn)文件的上傳與下載操作。接下來(lái),我們就來(lái)看看詳細(xì)的實(shí)現(xiàn)過(guò)程。

FileResource

我們?cè)?code>com.waylau.rest.resource 目錄下創(chuàng)建 FileResource 資源類,在里面寫兩個(gè)路徑,filepath 是文件下載路徑,serverLocation 是文件上傳的目錄。當(dāng)然 “小柳哥.txt” 這個(gè)文件是必須存在的。

private static final String filepath = "D:/測(cè)試文檔/小柳哥.txt";
private static final String serverLocation = "D:/測(cè)試文檔/";

文件下載

下載服務(wù)端

在 FileResource 資源類中添加 文件下載的代碼如下:

@GET
@Path("download")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response downloadFile() {

    File file = new File(filepath);
    if (file.isFile() && file.exists()) {
        String mt = new MimetypesFileTypeMap().getContentType(file);
        String fileName = file.getName();

        return Response
                .ok(file, mt)
                .header("Content-disposition",
                        "attachment;filename=" + fileName)
                .header("ragma", "No-cache")
                .header("Cache-Control", "no-cache").build();

    } else {
        return Response.status(Response.Status.NOT_FOUND)
                .entity("下載失敗,未找到該文件").build();
    }
}

@Produces(MediaType.APPLICATION_OCTET_STREAM) 這里就說(shuō)明了,文件將會(huì)以文件流的形式返回給客戶端。

下載客戶端

在 index.jsp 里面添加

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

測(cè)試

好了,代碼寫完,我們啟動(dòng)項(xiàng)目測(cè)試下。點(diǎn)擊 “Download”, 此時(shí),發(fā)現(xiàn)文件的名稱不見(jiàn)了。

file-up-down-01

這是因?yàn)橄到y(tǒng)解析不了編碼導(dǎo)致的。需要將文件名稱編碼做下轉(zhuǎn)化即可:

//處理文件名稱編碼
fileName = new String(fileName.getBytes("utf-8"),"ISO8859-1");

再次啟動(dòng)測(cè)試:

file-up-down-03

file-up-down-02

OK ,下載程序?qū)懲辍?/p>

處理大數(shù)量傳參下載的問(wèn)題

有時(shí)難免要傳遞的參數(shù)較大,GET 請(qǐng)求難以勝任,只能用 POST 來(lái)請(qǐng)求下載。

下面例子就是用一個(gè)隱藏的 Form 表單來(lái)傳參進(jìn)行文件的下載:

var exportUrl = 'rest/files/excel/easyui-datagird'
var form=$("<form>");//定義一個(gè)form表單
form.attr("style","display:none");
form.attr("target","");
form.attr("method","post");
form.attr("action",exportUrl);
var input1=$("<input>");
input1.attr("type","hidden");
input1.attr("name","fileName");
input1.attr("value",fileName);
var input2=$("<input>");
input2.attr("type","hidden");
input2.attr("name","columns");
input2.attr("value",JSON.stringify(columns));
var input3=$("<input>");
input3.attr("type","hidden");
input3.attr("name","rowsData");
input3.attr("value",JSON.stringify(rows));
$("body").append(form);//將表單放置在頁(yè)面中
form.append(input1);
form.append(input2);
form.append(input3);
form.submit().remove();;//表單提交并

其中,input 就是用來(lái)傳遞參數(shù)的。input 的 name 屬性是參數(shù)的名稱,value 屬性是參數(shù)的值。

服務(wù)端要做如下的處理:

@POST
@Path("excel/easyui-datagird")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response jsonToExcle(@FormParam("fileName") String fileName,
        @FormParam("columns") String columns,
        @FormParam("rowsData") String rowsData) {
    //這里是處理的業(yè)務(wù)邏輯代碼
}

文件上傳

上傳文件稍微要復(fù)雜,需要 multipart/form-data 請(qǐng)求。

依賴

添加 jersey-media-multipart 到 pom.xml

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-multipart</artifactId>
</dependency>

并在 RestApplication 里面注冊(cè) MultiPart

public class RestApplication extends ResourceConfig {

    public RestApplication() {
        //資源類所在的包路徑  
        packages("com.waylau.rest.resource");

        //注冊(cè) MultiPart
        register(MultiPartFeature.class);
    }
}

上傳服務(wù)端

在 FileResource 資源類中添加 文件下載的代碼如下:

   @POST
@Path("upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces("application/json")
public Response uploadFile(
        @FormDataParam("file") InputStream fileInputStream,
        @FormDataParam("file") FormDataContentDisposition contentDispositionHeader) 
            throws IOException {

    String fileName = contentDispositionHeader.getFileName();

    File file = new File(serverLocation + fileName); 
    File parent = file.getParentFile(); 
    //判斷目錄是否存在,不在創(chuàng)建 
    if(parent!=null&&!parent.exists()){ 
        parent.mkdirs(); 
    } 
    file.createNewFile(); 

    OutputStream outpuStream = new FileOutputStream(file);
    int read = 0;
    byte[] bytes = new byte[1024];

    while ((read = fileInputStream.read(bytes)) != -1) {
        outpuStream.write(bytes, 0, read);
    }

    outpuStream.flush();
    outpuStream.close();

    fileInputStream.close();

    return Response.status(Response.Status.OK)
            .entity("Upload Success!").build();
}

上傳客戶端

在 index.jsp 寫一個(gè)上傳的 Form 表單

<h3>Upload a File</h3>
<form action="webapi/files/upload" method="post" enctype="multipart/form-data">
   <p>
    Select a file : <input type="file" name="file" size="50" />
   </p>
   <input type="submit" value="Upload It" />
</form>

測(cè)試

選擇文件,點(diǎn)擊“Upload It”,上傳成功

file-up-down-04

file-up-down-05

源碼

見(jiàn) file-upload-down。

參考


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)