Raver | f79fdb6 | 2025-06-03 06:02:49 +0000 | [diff] [blame] | 1 | package api; |
| 2 | |
| 3 | import java.io.File; |
| 4 | |
Raver | aae0612 | 2025-06-05 08:13:35 +0000 | [diff] [blame^] | 5 | import javax.annotation.PostConstruct; |
| 6 | |
Raver | f79fdb6 | 2025-06-03 06:02:49 +0000 | [diff] [blame] | 7 | import org.springframework.core.io.FileSystemResource; |
| 8 | import org.springframework.core.io.Resource; |
| 9 | import org.springframework.http.HttpHeaders; |
Raver | aae0612 | 2025-06-05 08:13:35 +0000 | [diff] [blame^] | 10 | import org.springframework.http.HttpStatus; |
Raver | f79fdb6 | 2025-06-03 06:02:49 +0000 | [diff] [blame] | 11 | import org.springframework.http.MediaType; |
| 12 | import org.springframework.http.ResponseEntity; |
| 13 | import org.springframework.web.bind.annotation.RequestParam; |
| 14 | import org.springframework.web.bind.annotation.RestController; |
| 15 | import org.springframework.web.multipart.MultipartFile; |
Raver | aae0612 | 2025-06-05 08:13:35 +0000 | [diff] [blame^] | 16 | import org.springframework.web.bind.annotation.CrossOrigin; |
| 17 | |
| 18 | import com.fasterxml.jackson.core.JsonProcessingException; |
| 19 | import com.fasterxml.jackson.databind.ObjectMapper; |
Raver | f79fdb6 | 2025-06-03 06:02:49 +0000 | [diff] [blame] | 20 | |
| 21 | import database.Database1; |
| 22 | import entity.Seed; |
| 23 | import tracker.Tracker; |
| 24 | |
Raver | aae0612 | 2025-06-05 08:13:35 +0000 | [diff] [blame^] | 25 | |
Raver | f79fdb6 | 2025-06-03 06:02:49 +0000 | [diff] [blame] | 26 | @RestController |
| 27 | public class ApiController implements ApiInterface { |
| 28 | |
Raver | aae0612 | 2025-06-05 08:13:35 +0000 | [diff] [blame^] | 29 | private static Database1 db1; |
Raver | f79fdb6 | 2025-06-03 06:02:49 +0000 | [diff] [blame] | 30 | private static Tracker tracker; |
Raver | aae0612 | 2025-06-05 08:13:35 +0000 | [diff] [blame^] | 31 | private static ObjectMapper mapper; |
| 32 | |
| 33 | @PostConstruct |
| 34 | public void init() { |
| 35 | db1 = new Database1(); |
| 36 | tracker = new Tracker(); |
| 37 | mapper = new ObjectMapper(); |
| 38 | mapper.configure(com.fasterxml.jackson.databind.SerializationFeature.FAIL_ON_EMPTY_BEANS, false); |
| 39 | } |
Raver | f79fdb6 | 2025-06-03 06:02:49 +0000 | [diff] [blame] | 40 | |
| 41 | @Override |
| 42 | public ResponseEntity<Integer> saveTorrent( |
| 43 | @RequestParam("userid") String userid, |
| 44 | @RequestParam("title") String title, |
| 45 | @RequestParam("tag") String tag, |
| 46 | @RequestParam("file") MultipartFile file |
| 47 | ) { |
| 48 | try { |
| 49 | Seed seed = new Seed(); |
| 50 | seed.seedid = "exampleSeedId"; // 示例种子ID |
| 51 | seed.seeduserid = userid; // 示例用户ID |
| 52 | seed.title = title; // 示例标题 |
| 53 | seed.seedsize = "1GB"; // 示例种子大小 |
| 54 | seed.seedtag = tag; // 示例标签 |
| 55 | seed.url = "http://example.com/torrent"; // 示例URL |
Raver | aae0612 | 2025-06-05 08:13:35 +0000 | [diff] [blame^] | 56 | |
| 57 | int ret = db1.RegisterSeed(seed); |
| 58 | // System.out.println("RegisterSeed ret: " + ret); |
| 59 | // System.out.println(seed.seedid + " " + seed.seeduserid + " " + seed.title + " " + seed.seedsize + " " + seed.seedtag + " " + seed.url); |
| 60 | |
Raver | f79fdb6 | 2025-06-03 06:02:49 +0000 | [diff] [blame] | 61 | // Convert MultipartFile to File |
| 62 | File tempFile = File.createTempFile(seed.seedid, file.getOriginalFilename()); |
| 63 | file.transferTo(tempFile); |
Raver | aae0612 | 2025-06-05 08:13:35 +0000 | [diff] [blame^] | 64 | |
Raver | f79fdb6 | 2025-06-03 06:02:49 +0000 | [diff] [blame] | 65 | tracker.SaveTorrent(seed.seedid, tempFile); |
Raver | aae0612 | 2025-06-05 08:13:35 +0000 | [diff] [blame^] | 66 | |
Raver | f79fdb6 | 2025-06-03 06:02:49 +0000 | [diff] [blame] | 67 | // Optionally, delete the temp file after saving if not needed |
| 68 | // tempFile.delete(); |
Raver | aae0612 | 2025-06-05 08:13:35 +0000 | [diff] [blame^] | 69 | |
| 70 | // 创建带有 CORS 响应头的 ResponseEntity |
| 71 | HttpHeaders headers = new HttpHeaders(); |
| 72 | headers.add("Access-Control-Allow-Origin", "*"); // 允许所有域名访问,可以根据需要调整为特定域名 |
| 73 | headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); // 允许的 HTTP 方法 |
| 74 | headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization"); // 允许的请求头 |
| 75 | |
| 76 | return new ResponseEntity<>(0, headers, HttpStatus.OK); // 返回 0 表示成功 |
Raver | f79fdb6 | 2025-06-03 06:02:49 +0000 | [diff] [blame] | 77 | } catch (Exception e) { |
| 78 | e.printStackTrace(); |
Raver | aae0612 | 2025-06-05 08:13:35 +0000 | [diff] [blame^] | 79 | |
| 80 | // 创建带有 CORS 响应头的错误 ResponseEntity |
| 81 | HttpHeaders errorHeaders = new HttpHeaders(); |
| 82 | errorHeaders.add("Access-Control-Allow-Origin", "*"); |
| 83 | errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); |
| 84 | errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization"); |
| 85 | |
| 86 | return new ResponseEntity<>(1, errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 1 表示失败 |
Raver | f79fdb6 | 2025-06-03 06:02:49 +0000 | [diff] [blame] | 87 | } |
| 88 | } |
| 89 | |
| 90 | @Override |
Raver | aae0612 | 2025-06-05 08:13:35 +0000 | [diff] [blame^] | 91 | @CrossOrigin(origins = "*", allowedHeaders = "*") // 允许所有来源和头部 |
Raver | f79fdb6 | 2025-06-03 06:02:49 +0000 | [diff] [blame] | 92 | public ResponseEntity<Resource> getTorrent( |
Raver | aae0612 | 2025-06-05 08:13:35 +0000 | [diff] [blame^] | 93 | @RequestParam("torrentId") String seedid, |
| 94 | @RequestParam("userId") String userid |
Raver | f79fdb6 | 2025-06-03 06:02:49 +0000 | [diff] [blame] | 95 | ) { |
Raver | aae0612 | 2025-06-05 08:13:35 +0000 | [diff] [blame^] | 96 | File file = tracker.GetTTorent(seedid, userid); |
Raver | f79fdb6 | 2025-06-03 06:02:49 +0000 | [diff] [blame] | 97 | if (file != null) { |
| 98 | FileSystemResource resource = new FileSystemResource(file); |
| 99 | return ResponseEntity.ok() |
| 100 | .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getName() + "\"") |
Raver | aae0612 | 2025-06-05 08:13:35 +0000 | [diff] [blame^] | 101 | .header(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, HttpHeaders.CONTENT_DISPOSITION) // 关键:允许前端访问Content-Disposition |
Raver | f79fdb6 | 2025-06-03 06:02:49 +0000 | [diff] [blame] | 102 | .contentType(MediaType.APPLICATION_OCTET_STREAM) |
| 103 | .body(resource); |
| 104 | } else { |
Raver | aae0612 | 2025-06-05 08:13:35 +0000 | [diff] [blame^] | 105 | return ResponseEntity.notFound().build(); |
| 106 | } |
| 107 | } |
| 108 | |
| 109 | //无按标签查询的函数 |
| 110 | @Override |
| 111 | public ResponseEntity<String> getSeedListByTag( |
| 112 | @RequestParam("tag") String tag |
| 113 | ) { |
| 114 | try { |
| 115 | Seed[] seeds = db1.GetSeedListByTag(tag); |
| 116 | String json = mapper.writeValueAsString(seeds); |
| 117 | // System.out.println("getSeedListByTag: " + json); |
| 118 | HttpHeaders headers = new HttpHeaders(); |
| 119 | headers.add("Access-Control-Allow-Origin", "*"); |
| 120 | headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); |
| 121 | headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization"); |
| 122 | return new ResponseEntity<>(json, headers, HttpStatus.OK); |
| 123 | } catch (JsonProcessingException e) { |
| 124 | e.printStackTrace(); |
| 125 | HttpHeaders errorHeaders = new HttpHeaders(); |
| 126 | errorHeaders.add("Access-Control-Allow-Origin", "*"); |
| 127 | errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); |
| 128 | errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization"); |
| 129 | return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); |
| 130 | } |
| 131 | } |
| 132 | |
| 133 | @Override |
| 134 | public ResponseEntity<String> getTorrentDetail( |
| 135 | @RequestParam("id") String seedid |
| 136 | ) { |
| 137 | try { |
| 138 | Seed seed = db1.GetSeedInformation(seedid); |
| 139 | if (seed != null) { |
| 140 | String json = mapper.writeValueAsString(seed); |
| 141 | HttpHeaders headers = new HttpHeaders(); |
| 142 | headers.add("Access-Control-Allow-Origin", "*"); |
| 143 | headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); |
| 144 | headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization"); |
| 145 | return new ResponseEntity<>(json, headers, HttpStatus.OK); |
| 146 | } else { |
| 147 | return ResponseEntity.notFound().build(); // 返回 404 表示种子未找到 |
| 148 | } |
| 149 | } catch (JsonProcessingException e) { |
| 150 | e.printStackTrace(); |
| 151 | HttpHeaders errorHeaders = new HttpHeaders(); |
| 152 | errorHeaders.add("Access-Control-Allow-Origin", "*"); |
| 153 | errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); |
| 154 | errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization"); |
| 155 | return new ResponseEntity<>("{}", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); |
Raver | f79fdb6 | 2025-06-03 06:02:49 +0000 | [diff] [blame] | 156 | } |
| 157 | } |
| 158 | } |