Carga y descarga de archivos adjuntos, descarga de archivos adjuntos el hoyo del salto de la página de inicio

Las cargas y descargas adicionales no se han escrito por sí mismas en el proyecto, todos son métodos listos para usar en el marco que se llaman directamente, por lo que cada vez que encuentro que el marco del proyecto no proporciona métodos, me siento tímido, aquí hay un registro de lo que escribí en los métodos de carga y descarga de archivos adjuntos del proyecto, y los problemas encontrados en la parte anterior de la descarga;

Actualizar archivos

Lo que se proporciona aquí es una interfaz y la carga se realiza de forma asincrónica en el párrafo anterior;

La forma de escribir la interfaz de nuestro proyecto es un poco extraña, que no es la misma que usamos a menudo;

El componente de carga de adjuntos de Layui se usó en el párrafo anterior, que es más conveniente de escribir;

    /**
     * 附件上传  单文件上传
     * @param request
     * @param response
     * @param
     */
    @RequestMapping(value = "uploadFile", method = RequestMethod.POST)
    public void uploadFile(HttpServletRequest request, HttpServletResponse response){
      {
        Result result = new Result();
        String json = "";
        Claims b = JWTUtil.parseJWT(request.getParameter("token"), ConfigLoader.baseSecurity);
        String accountName = (String) b.get("accountName");
        Accounts account = accountServicesImpl.getEntityBySql("select * from accounts where account_name = '" + accountName + "' and del_flag = 0", null, Accounts.class);
        User user = accountServicesImpl.getUserByAccount(account.getId());
        File file = null;
        try{
//            MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
//            MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
            MultipartFile multipartFilefile = multipartRequest.getFile("file");

            String filename = "";
            Long size = 0l;
//            MultipartFile multipartFilefile=null;
//            Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
//            for (Map.Entry<String, MultipartFile> entry : fileMap.entrySet()) {
//                multipartFilefile = entry.getValue();
                filename = multipartFilefile.getOriginalFilename();
                size = multipartFilefile.getSize();
//            }

            // 从数据字典中获取上传路径
            String upconfigPath = "";
            List<CategoryAttributes> leiMuAtt = new ArrayList<CategoryAttributes>();
            leiMuAtt = ConfCache.attributeConfMap.get("Path_Upload");
            if (leiMuAtt != null && leiMuAtt.size() > 0) {
                for (CategoryAttributes tr : leiMuAtt) {
                    CategoryAttributes c = (CategoryAttributes) tr;
                    if (c.getCategoryAttributesName().equals("上传公共路径")) {
                        upconfigPath = c.getCategoryAttributesValue();
                    }
                }
            }
//            String downconfigPath = upconfigPath.substring(upconfigPath.lastIndexOf("/") + 1);
            // 从数据字典中获取下载路径
//             String downconfigPath = "";
//             List<CategoryAttributes> leiMuAttt=new ArrayList<CategoryAttributes>();
//             leiMuAttt=ConfCache.attributeConfMap.get("Path_Download");
//             if(leiMuAtt!=null && leiMuAttt.size()>0){
//                 for (CategoryAttributes tr : leiMuAttt) {
//                     CategoryAttributes c = (CategoryAttributes)tr;
//                     downconfigPath=c.getCategoryAttributesValue();
//                     break;
//                 }
//             }
            // 获取日期时间
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            String date = sdf.format(new Date());
            SimpleDateFormat sdft = new SimpleDateFormat("HHmmssSSS");
            String timeValue = sdft.format(new Date());
            // 上传到服务器的路径(数据字典上传配置+“/attachment/”附件文件夹+日期)
            String dir = "";

            dir = upconfigPath + "/taskfiles/" + date + "/";
//            downconfigPath = downconfigPath + "/taskfiles";

            File directory = new File(dir);
            // 目录不存在,创建目录
            if (!directory.exists()) {
                directory.mkdir();
            }
            // 原文件信息
            System.out.println(filename);

            try {
                filename = java.net.URLDecoder.decode(filename, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            System.out.println(filename);
            String oldfilename = filename.substring(filename.lastIndexOf("\\") + 1);
            String sourcename = oldfilename.substring(0, oldfilename.lastIndexOf(".")); // 文件名
            String ofileType = oldfilename.substring(oldfilename.lastIndexOf(".") + 1); // 文件后缀
            Long ofileSize = size;
            // 新路径(dir配置路径+时间戳.格式后缀)
            String newfile = dir + timeValue + "." + ofileType;
            file = new File(newfile);
            Attachment attachment = new Attachment();// 记录上传的信息
            try {
                if (!file.exists()) {
//                    Accounts account = (Accounts) ss.getAttribute("login_user");
                    attachment.setFileName(sourcename);
                    attachment.setDir(dir); // 下载时的相对路径
                    attachment.setFileSize(ofileSize);
                    attachment.setPhysicalName(timeValue + "");
                    attachment.setCreateTime(new Date());
                    attachment.setCreateUserId(account.getId());
                    // attachment.setAttachedTable(attachedTable);
                    attachment.setStatus(0);
                    attachment.setFileType(0);
                    // attachment.setRecordId(recordId);
                    attachment.setExt(ofileType);
                    attachment.setUploadPath(dir + timeValue + "." + ofileType);
                    attachmentServicesImpl.save(attachment);
                }
//                FileUtils.copyFile((File) files.get(0), file);// 上传 (复制文件)
                FileUtils.copyInputStreamToFile(multipartFilefile.getInputStream(),file);
            } catch (IOException e1) {
                e1.printStackTrace();
                throw new RuntimeException("文件上传失败!");
            }
            StringBuffer sb = new StringBuffer();
            sb.append("{");
            sb.append("\"code\":");
            sb.append(0 + ",");
            sb.append("\"msg\":");
            sb.append("\"上传成功!\",");
            sb.append("\"data\":");
            sb.append(JsonUtil.object2json(attachment));
            sb.append("}");
            json = sb.toString();
        }catch(Exception e){
            StringBuffer sb = new StringBuffer();
            sb.append("{");
            sb.append("\"code\":");
            sb.append(1 + ",");
            sb.append("\"msg\":");
            sb.append("\"上传失败!\",");
            sb.append("}");
            json = sb.toString();
        }
        this.print(json,response);
    }

La dificultad radica en cómo obtener la información del archivo adjunto de HttpServletRequest, que es MultipartFile. Al principio, se utilizó el siguiente método

MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
List<MultipartFile> files = multipartRequest.getFiles("files");

Pero este método informará un error, indicando que no se puede convertir directamente a MultipartHttpServletRequest, por lo que se reemplaza por la conversión del método superior, por lo que después del cambio, todavía no funciona y solicita que el número en multipartRequest.getFiles ( "archivos") es 0, lo que significa que no hay ningún archivo adjunto, así que utilice el siguiente método:

MultipartFile multipartFilefile=null;
            Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
            for (Map.Entry<String, MultipartFile> entry : fileMap.entrySet()) {
                multipartFilefile = entry.getValue();
                filename = multipartFilefile.getOriginalFilename();
                size = multipartFilefile.getSize();
            }

La ruta de carga se obtiene directamente del diccionario de datos;

Nota: Los dos anteriores son métodos para cargar varios archivos, que se modificaron más tarde, y el código en el código es solo para cargar un solo archivo;

Aquí se usa una clase de herramienta FileUtils en el paquete org.apache.commons.io Hay muchas formas de manipular archivos, que se pueden encontrar en Internet, pero no las enumeraré aquí;

La ruta de carga obtenida del diccionario de datos aquí es / u06 / upload, por lo que la ruta a la biblioteca después de que se cargue el archivo también es esta; además, y /u06/upload/date/filename.houzhui también se almacena en la base de datos , y se descarga directamente al descargar Tomé este campo. Después de que el archivo se cargó correctamente, finalmente se cargó en la carpeta / u06 / upload en el mismo nivel que el espacio de trabajo de mi proyecto;

descargar archivo adjunto

Primero pegue el código del controlador de fondo:

 /**
     * 附件下载
     * @param request
     * @param response
     * @param
     */
    @RequestMapping(value = "downloadFile")
    public void downloadFile(HttpServletRequest request, HttpServletResponse response, String id){
        Result result = new Result();
        try{
            Base base = new Attachment();
            base.setId(id);
            String ids = request.getParameter("id");
            Attachment attachment = (Attachment) attachmentServicesImpl.getBean(base);
            String fileName = attachment.getFileName() + "." + attachment.getExt();
//            String dir = attachment.getDir();
            String path = attachment.getUploadPath();
            File sourceFile = new File(path);
            if (!sourceFile.exists()) {  throw new Exception("您下载的资源已不存在");  }
            BufferedInputStream in = null;
            ServletOutputStream out = null;
            try {
//              fileName = URLEncoder.encode(fileName, "UTF-8"); //解决下载文件名乱码
                response.reset();
                response.setCharacterEncoding("UTF-8");
//              response.setContentType("application/octet-stream");
                response.setContentType("application/force-download");
                response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
                in = new BufferedInputStream(new FileInputStream(sourceFile));
                out = response.getOutputStream();
                byte[] buffer = new byte[1024];
                int len = 0;
                while ((len = in.read(buffer)) != -1) {
                    out.write(buffer, 0, len);
                }
                out.flush();
            } catch (Exception e) {
                e.printStackTrace();
                throw new Exception(fileName + " 下载出错,若有问题请与管理员联系");
            } finally {
                out.close();
                in.close();
            }
            result.setSuccess(true);
            result.setMessage("下载成功");
        }catch(Exception e){
            e.printStackTrace();
            result.setSuccess(false);
            result.setMessage("下载失败!"+e.getMessage());
        }
//        this.print(result.toString(),response);
    }

Hablemos de los pozos encontrados durante la descarga. Al descargar, hice clic en la etiqueta <a> y luego activé un ajax para llamar a la descarga en segundo plano, pero esta página no solicitó ninguna solicitud de descarga y no se informaron errores, pero no eran archivos en la respuesta. El contenido, lo verifiqué en Internet y descubrí que la descarga del archivo adjunto no se puede realizar con ajax. Parece que ajax devuelve el resultado del tipo de carácter y el navegador no puede analizar el archivo adjunto en la respuesta , así que debo cambiar el método. Leí el método de otras personas. El método es útil para window.href.location y también para usar el atributo de descarga en la etiqueta a. También probé este atributo. La descarga no es el archivo original, pero un archivo vacío llamado descargar, y luego escribir el fondo directamente en el atributo href Si la dirección está mapeada, la página salta y no hay descarga de archivos adjuntos; finalmente, el método de envío de datos de formulario se usa para solicitar, por lo que la página no saltar, y el archivo adjunto se puede descargar;

Pegue el código anterior;

<div class="layui-upload-list">
            <table class="layui-table">
                <thead>
                <tr><th>文件名</th>
                    <th>大小</th>
                    <th>状态</th>
                    <th>操作</th>
                </tr></thead>
                <tbody id="demoList"></tbody>
            </table>
        </div>
 $("#demoList").append('<tr>' +
                                                    '<td><a href="#">'+data.list[i].fileName+'.'+data.list[i].ext+'</a></td>' +
                                                    '<td>'+((data.list[i].fileSize)/1014).toFixed(1)+'kb</td>' +
                                                    '<td><span style="color: #5FB878;">上传成功</span></td>' +
                                                    '<td>' +
                                                        '<button class="layui-btn layui-btn-xs demo-reload layui-hide">重传</button>'+
                                                        '<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete-exist">删除</button>' +
                                                    '</td>' +
                                                    '<td class="layui-hide">'+data.list[i].id+'</td>' +
                                                    '</tr>')
 $("#demoList").find("a").on('click',function (e) {
                                        var p_tr = $(this).parent().parent();
                                        //删除附件数组内的附件id
                                        var tds = p_tr.children();
                                        //找到该附件的主键
                                        var id = tds.eq(4).text();
                                        var $eleForm = $("<form method='get'></form>");
                                        $eleForm.attr("action","/CenterChainTaskController/downloadFile");
                                        $(document.body).append($eleForm);
                                        $eleForm.append('<input type="text" name="id" value="'+id+'">')
                                        //提交表单,实现下载
                                        $eleForm.submit();
                                    })

 

Supongo que te gusta

Origin blog.csdn.net/tonglei111/article/details/101039307
Recomendado
Clasificación