正如其他管理系統(tǒng)一般,REST也需要實現(xiàn)文件的上傳與下載操作。接下來,我們就來看看詳細的實現(xiàn)過程。
我們在com.waylau.rest.resource
目錄下創(chuàng)建 FileResource 資源類,在里面寫兩個路徑,filepath 是文件下載路徑,serverLocation 是文件上傳的目錄。當然 “小柳哥.txt” 這個文件是必須存在的。
private static final String filepath = "D:/測試文檔/小柳哥.txt";
private static final String serverLocation = "D:/測試文檔/";
在 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)
這里就說明了,文件將會以文件流的形式返回給客戶端。
在 index.jsp 里面添加
<p><a href="webapi/files/download">Download</a>
好了,代碼寫完,我們啟動項目測試下。點擊 “Download”, 此時,發(fā)現(xiàn)文件的名稱不見了。
這是因為系統(tǒng)解析不了編碼導致的。需要將文件名稱編碼做下轉(zhuǎn)化即可:
//處理文件名稱編碼
fileName = new String(fileName.getBytes("utf-8"),"ISO8859-1");
再次啟動測試:
OK ,下載程序?qū)懲辍?/p>
有時難免要傳遞的參數(shù)較大,GET 請求難以勝任,只能用 POST 來請求下載。
下面例子就是用一個隱藏的 Form 表單來傳參進行文件的下載:
var exportUrl = 'rest/files/excel/easyui-datagird'
var form=$("<form>");//定義一個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);//將表單放置在頁面中
form.append(input1);
form.append(input2);
form.append(input3);
form.submit().remove();;//表單提交并
其中,input 就是用來傳遞參數(shù)的。input 的 name 屬性是參數(shù)的名稱,value 屬性是參數(shù)的值。
服務端要做如下的處理:
@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è)務邏輯代碼
}
上傳文件稍微要復雜,需要 multipart/form-data 請求。
添加 jersey-media-multipart 到 pom.xml
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
</dependency>
并在 RestApplication 里面注冊 MultiPart
public class RestApplication extends ResourceConfig {
public RestApplication() {
//資源類所在的包路徑
packages("com.waylau.rest.resource");
//注冊 MultiPart
register(MultiPartFeature.class);
}
}
在 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 寫一個上傳的 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>
選擇文件,點擊“Upload It”,上傳成功
見 file-upload-down
。
更多建議: