之前做过一个电视台app,电视台app每次启动时会访问服务器,判断是否需要下载新版本
但是下载时老是下载失败,apk包总是下载不下来.到底是什么原因呢?
服务器下载接口如下:
- /***
- * 下载apk
- * @param path
- * @param request
- * @return
- * @throws IOException
- */
- @RequestMapping(value = "/download"/*, headers = {"content-type=application/json"}*/)
- public ResponseEntity<byte[]> download( String path,HttpServletRequest request) throws IOException {
- AccessLog accessLog=logInto(request);
- accessLog.setDescription("下载客户端");
- if(!ValueWidget.isNullOrEmpty(request.getContentType())&& request.getContentType().toLowerCase().contains("application/json")){
- String requestStr=WebServletUtil.getRequestQueryStr(request, null);
- System.out.println(requestStr);
- Map queryMap=JSONPUtil.getMapFromJson(requestStr);
- if(!ValueWidget.isNullOrEmpty(queryMap)){
- path=(String) queryMap.get("path");
- }
- }
- if(ValueWidget.isNullOrEmpty(path)){
- System.out.println("download failed");
- accessLog.setOperateResult("下载失败,没有传递path参数");
- logSave(accessLog, request);
- return null;
- }
- String realpath =WebServletUtil.getUploadPath(request, "upload/download/apk", request
- .getSession().getServletContext(), Constant2.SRC_MAIN_WEBAPP);
- if(!realpath.endsWith(File.separator)){
- realpath=realpath+File.separator;
- }
- HttpHeaders headers = new HttpHeaders();
- headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
- String fullpath=realpath+path;
- System.out.println("download path:"+fullpath);
- headers.set(Constant2.CONTENT_DISPOSITION,WebServletUtil.getContentDisposition(true, path));
- accessLog.setOperateResult("下载成功,下载文件:"+fullpath+" ,size:"+FileUtils.getFileSize2(fullpath));
- logSave(accessLog, request);
- return new ResponseEntity<byte[]>(FileUtils.getBytes4File(fullpath),
- headers, HttpStatus.CREATED);
- }
安卓端调用的下载方法(核心代码)如下:
- /***
- *
- * @param huc
- * @param sendBytes
- * @param mode
- * @param isWrite2file
- * : 是否写入文件
- * @return
- * @throws Exception
- */
- private static byte[] connection(HttpURLConnection huc,
- boolean isWrite2file, Object file, String sizeHeadKey)
- throws Exception {
- int resCode = huc.getResponseCode();
- if (resCode == HttpURLConnection.HTTP_OK) {
- int contentLength = 0;
- if (ValueWidget.isNullOrEmpty(sizeHeadKey)) {// 若header中没有size
- contentLength = huc.getContentLength();
- } else {
- String sizeHeaderValue = huc.getHeaderField(sizeHeadKey);
- if (!ValueWidget.isNullOrEmpty(sizeHeaderValue)) {
- contentLength = Integer.parseInt(sizeHeaderValue);
- }
- }
- if (isDetail) {
- System.out
- .println("[connection]contentLength:" + contentLength);
- responseHeaderFields = huc.getHeaderFields();
- String downloadHeader = "Content-Disposition";
- if (!ValueWidget.isNullOrEmpty(responseHeaderFields)) {
- List<String> ContentDispositions = responseHeaderFields
- .get(downloadHeader);
- if (!ValueWidget.isNullOrEmpty(ContentDispositions)) {
- String ContentDisposition = ContentDispositions.get(0);
- System.out.println("ContentDisposition:"
- + ContentDisposition);
- System.out.println("ContentDisposition convertISO2UTF:"
- + SystemHWUtil
- .convertISO2UTF(ContentDisposition));
- System.out
- .println("ContentDisposition convertISO2GBK: "
- + SystemHWUtil
- .convertISO2GBK(ContentDisposition));
- }
- }
- for (Object obj : responseHeaderFields.keySet()) {
- List<String> list = responseHeaderFields.get(obj);
- if (!ValueWidget.isNullOrEmpty(list)) {
- System.out.println(obj + " : "
- + SystemHWUtil.formatArr(list, ";"));
- }
- }
- System.out
- .println("[connection]contentLength:" + contentLength);
- }
- if (contentLength > 0) {
- if (isDetail)
- System.out
- .println("[HttpSocketUtil.connection]httputil,contentLength:"
- + contentLength);
- // return readData(huc);
- File file2 = null;
- if (isWrite2file) {
- if (file instanceof File) {
- file2 = (File) file;
- writeFileFromLength(huc, contentLength, file2);
- if (isDetail) {
- System.out.println("download success:"
- + file2.getAbsolutePath());
- }
- } else {
- writeFileFromLength(huc, contentLength,
- (OutputStream) file);
- }
- return null;
- } else {
- return readDataFromLength(huc, contentLength);
- }
- } else {
- if (isWrite2file) {
- InputStream in = huc.getInputStream();
- FileUtils.writeIn2OutputCloseAll(in, new FileOutputStream(
- (File) file));
- if (isDetail) {
- System.out.println("download success:"
- + ((File) file).getAbsolutePath());
- }
- return null;
- }
- return readData(huc);
- }
- } else {
- System.out.println("response Code:" + resCode);
- }
- return null;
- }
代码本身是没有逻辑错误的.花了很长时间才找到原因,是定义的response的status code不一致.
后台设置的status code是201,而Android端判断的status code是200,不一致导致下载流程没有走到下载逻辑.
修改方法:把后台的status code改为200 就OK了
时间: 2024-10-03 19:35:35