上传附件获取不到路径值。

上传附件时应该吧form表单的类型设置为enctype="multipart/form-data"

java代码

int updateSize=0;
    Map<String, Object> result = new HashMap();
    String path="";
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setSizeThreshold(Integer.parseInt(ReadConfigUtil.getPlatformConfig("fileUpload.memorySizeThreshold")));
         ServletFileUpload upload = new ServletFileUpload(factory);
       upload.setSizeMax(Integer.parseInt(ReadConfigUtil.getPlatformConfig("fileUpload.totalFileMaxsize")));
        upload.setHeaderEncoding("UTF-8");
      HttpSession session = request.getSession();
         
       String checkResutlMessage = null;
       String errorCode = null;
        int totalCount = 0;
        int validatedDataCount = 0;
      try {
         List<?> items = upload.parseRequest(request);
         FileItem item = null;
        for (int i = 0; i < items.size(); i++) {
            item = (FileItem)items.get(i);
       if ((!item.isFormField()) && (item.getName().length() > 0)) {
    String a=item.toString();
    path=a.substring(a.indexOf("StoreLocation=")+14,a.indexOf("size")-2);
               Workbook workbook = ExcelParseUtil.getWorkbook(item);
       Sheet dataSheet = workbook.getSheetAt(0);
        Cell cell = null;
        for (int j = 1; j <= dataSheet.getLastRowNum(); j++) {
Row row = dataSheet.getRow(j);
if (row == null) {
continue;
}
// 遍历获取该行的所有数据
String ext_field1 = "";
if (row.getCell(0) != null) {
row.getCell(0).setCellType(cell.CELL_TYPE_STRING);
cell = row.getCell(0);
ext_field1 = cell.getStringCellValue();
}
String fileno = "";
if (row.getCell(1) != null) {
row.getCell(1).setCellType(cell.CELL_TYPE_STRING);
cell = row.getCell(1);
fileno = cell.getStringCellValue();
}
String ext_field2 = "";
if (row.getCell(2) != null) {
row.getCell(2).setCellType(cell.CELL_TYPE_STRING);
cell = row.getCell(2);
ext_field2 = cell.getStringCellValue();
}
String ext_field3 = "";
if (row.getCell(3) != null) {
row.getCell(3).setCellType(cell.CELL_TYPE_STRING);
cell = row.getCell(3);
ext_field3 = cell.getStringCellValue();
}
String keyword = "";
if (row.getCell(4) != null) {
row.getCell(4).setCellType(cell.CELL_TYPE_STRING);
cell = row.getCell(4);
keyword = cell.getStringCellValue();
}
String filename = "";
if (row.getCell(5) != null) {
row.getCell(5).setCellType(cell.CELL_TYPE_STRING);
cell = row.getCell(5);
filename = cell.getStringCellValue().replace("'", "''");
}
String filetype = "";
if (row.getCell(6) != null) {
row.getCell(6).setCellType(cell.CELL_TYPE_STRING);
cell = row.getCell(6);
filetype = cell.getStringCellValue();
}
String createusername = "";
if (row.getCell(7) != null) {
row.getCell(7).setCellType(cell.CELL_TYPE_STRING);
cell = row.getCell(7);
createusername = cell.getStringCellValue();
}
String versionupdatetime = "";
if (row.getCell(8) != null) {
row.getCell(8).setCellType(cell.CELL_TYPE_STRING);
cell = row.getCell(8);
versionupdatetime = cell.getStringCellValue();
// 如果值为空则插入当前时间
if ("".equals(versionupdatetime)) {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
versionupdatetime = sdf.format(System.currentTimeMillis());
}
} else {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
versionupdatetime = sdf.format(System.currentTimeMillis());
}
long size = 0;
if (row.getCell(9) != null) {
row.getCell(9).setCellType(cell.CELL_TYPE_STRING);
cell = row.getCell(9);
String filesize = cell.getStringCellValue();
filesize = filesize.replace("k", "");
size = (long) ((Double.valueOf(filesize)) * 1024);
}
String filelocation = "";
if (row.getCell(10) != null) {
row.getCell(10).setCellType(cell.CELL_TYPE_STRING);
cell = row.getCell(10);
filelocation = cell.getStringCellValue();
}
String eventid = "";
if (row.getCell(11) != null) {
row.getCell(11).setCellType(cell.CELL_TYPE_STRING);
cell = row.getCell(11);
eventid = cell.getStringCellValue();
}
updateSize=this.docCenterService.getAllPath(ext_field1,fileno,ext_field2,ext_field3,keyword,filename,filetype,createusername,versionupdatetime,filelocation,size,eventid);
          }
         }
    }
      } catch (Exception e) {
        e.printStackTrace();
      }
    Map map=new HashMap<>();
    if(updateSize!=0){
    map.put("success", 1);
    map.put("size", updateSize);
    }
    return map;

<think>好的,用户想了解如何从JPA后台获取多个附件类型并实现上传功能,结合AngularJS前端。我需要结合之前的回答和提供的引用内容来构建解决方案。 首先,用户之前的问题是关于AngularJS实现文件上传的,现在他们希望扩展到多附件上传,并且后台使用JPA处理。我需要确保前后端的数据流正确,尤其是如何处理不同的附件类型。 根据引用[1],提到了Model 2架构,其中Servlet作为控制器处理请求,JSP作为视图。这里可能涉及将上传请求发送到Spring MVC控制器,然后由控制器调用JPA层处理数据存储。所以后端可能需要用Spring MVC和JPA来接收文件并保存到数据库或文件系统。 在之前的回答中,用户使用了ng-file-upload插件和手动FormData两种方法。这里可能需要继续使用这些方法,但需要调整以支持多文件上传,并且传递附件类型。例如,前端表单可能需要让用户选择文件的同时选择类型,或者在请求中包含类型参数。 引用[3]提到Spring Data Redis,虽然这里可能用不上,但Spring Data JPA是相关的。需要设计JPA实体来存储附件的信息,比如文件名、类型、存储路径等。可能需要一个Attachment实体,包含类型字段,如fileType,并使用Lob注解存储二进制数据或路径。 接下来,考虑前端如何传递多个文件和它们的类型。可能需要每个文件对应一个类型,或者在表单中添加额外的字段来指定类型。例如,使用AngularJS的ng-model绑定每个文件的类型,或者在提交时将类型信息与文件一起发送。 后端处理方面,Spring MVC的控制器需要接收MultipartFile数组以及对应的类型数组。使用@RequestParam("files") MultipartFile[] files和@RequestParam("types") String[] types来接收,然后循环处理每个文件,保存到数据库或文件系统,并记录类型。 关于JPA部分,附件实体可能需要包含类型字段,所以在保存时,需要将前端传递的类型设置到实体中。如果存储的是文件路径,还需要处理文件的实际存储位置和访问方式。 还需要考虑事务管理,确保多个文件的上传操作是原子的,或者允许部分成功。此外,异常处理也很重要,比如文件大小限制、类型限制等,可以在前端或后端进行验证。 最后,测试整个流程,确保前端能正确上传多个文件及类型,后端能正确接收并存储到数据库,并且能通过JPA查询获取这些附件信息。 可能的问题包括前端如何组织多文件上传的表单,后端如何处理多个文件参数,以及JPA实体如何设计。需要参考之前的AngularJS代码示例,扩展为多文件上传,并在后端添加类型处理逻辑。</think>### AngularJS 多附件上传与JPA后台实现 #### 前端实现(AngularJS) 1. **HTML模板调整** 使用`ngf-select`指令支持多文件选择,并通过输入框获取附件类型: ```html <div ng-app="myApp" ng-controller="UploadCtrl"> <input type="file" ngf-select ng-model="files" multiple accept="*/*"> <!-- 允许多选 --> <input type="text" ng-model="attachmentType" placeholder="附件类型(如合同、报告)"> <button ng-click="upload()">批量上传</button> </div> ``` 2. **控制器逻辑** 通过`Upload`服务发送多文件及类型参数: ```javascript app.controller('UploadCtrl', ['$scope', 'Upload', function($scope, Upload) { $scope.upload = function() { if ($scope.files && $scope.files.length) { Upload.upload({ url: '/api/upload', data: { files: $scope.files, // 文件数组 attachmentType: $scope.attachmentType // 附件类型参数 }, method: 'POST' }).then(response => { console.log('上传成功:', response.data); }, error => { console.error('上传失败:', error); }); } }; }]); ``` --- #### 后端实现(Spring MVC + JPA) 1. **JPA实体设计** 定义`Attachment`实体存储附件元数据(如类型、路径、文件名): ```java @Entity public class Attachment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String fileType; // 附件类型(如合同、报告) private String fileName; // 原始文件名 private String filePath; // 存储路径(建议保存到文件系统而非数据库) // Getters & Setters } ``` 2. **文件上传接口** Spring MVC控制器接收文件并调用JPA保存元数据: ```java @RestController @RequestMapping("/api") public class FileUploadController { @Autowired private AttachmentRepository attachmentRepo; @PostMapping("/upload") public ResponseEntity<?> handleUpload( @RequestParam("files") MultipartFile[] files, @RequestParam("attachmentType") String attachmentType) { for (MultipartFile file : files) { String filePath = saveFileToStorage(file); // 实际保存到文件系统的方法 // 保存元数据到数据库 Attachment attachment = new Attachment(); attachment.setFileType(attachmentType); attachment.setFileName(file.getOriginalFilename()); attachment.setFilePath(filePath); attachmentRepo.save(attachment); } return ResponseEntity.ok("上传成功"); } private String saveFileToStorage(MultipartFile file) { // 实现文件存储逻辑(如保存到本地目录或云存储) String path = "/uploads/" + UUID.randomUUID() + "_" + file.getOriginalFilename(); // ... 实际写入操作 return path; } } ``` --- #### 关键问题解决 1. **多附件类型处理** - 前端可通过表单字段动态传递类型参数(如每个文件单独指定类型) - 后端通过`@RequestParam`接收参数并绑定到JPA实体字段 2. **大文件优化** ```properties # application.properties 配置 spring.servlet.multipart.max-file-size=100MB spring.servlet.multipart.max-request-size=100MB ``` 3. **事务管理** ```java @Transactional public void batchSaveAttachments(List<Attachment> attachments) { attachmentRepo.saveAll(attachments); } ``` --- ### 技术要点总结 1. **前端文件组织** 使用`multiple`属性实现多选,通过`FormData`自动封装文件数组[^1] 2. **后端存储策略** - **数据库存储**:仅保存元数据(推荐) - **文件系统存储**:通过`java.nio.file.Files`实现物理文件保存 - **云存储**:集成AWS S3或阿里云OSS SDK 3. **类型关联查询** 通过JPA动态查询获取特定类型的附件: ```java public interface AttachmentRepository extends JpaRepository<Attachment, Long> { List<Attachment> findByFileType(String type); // 根据类型检索 } ``` --- ### 相关问题 1. 如何实现文件上传进度条功能? 2. JPA存储文件元数据时如何优化分页查询? 3. 如何防止重复上传同名文件? 4. 如何设计RBAC权限控制附件访问?[^4] [^1]: Model 2模式下控制器负责业务逻辑处理,与JPA层解耦 [^2]: 组件化开发模式可提升前端代码复用性 [^3]: Spring Data系列模块简化了数据访问层开发 [^4]: Shiro可集成实现细粒度的附件访问控制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值