diff --git a/src/main/java/tracker/Tracker.java b/src/main/java/tracker/Tracker.java
index 6334ebb..210b9bf 100644
--- a/src/main/java/tracker/Tracker.java
+++ b/src/main/java/tracker/Tracker.java
@@ -1,20 +1,24 @@
 package tracker;
 
 import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
 import java.util.HashMap;
 import java.util.Map;
-
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.EntityTransaction;
 import javax.persistence.Persistence;
-
 import com.querydsl.jpa.impl.JPAUpdateClause;
-
 import entity.QUserPT;
-import entity.TTorent;
+import entity.Seed;
+import entity.SeedDownload;
 import entity.TransRecord;
 import entity.config;
+import entity.TTorent;
+import java.time.LocalDateTime;
 
 public class Tracker implements TrackerInterface {
     private final EntityManagerFactory emf;
@@ -163,17 +167,69 @@
         }
     }
 
+    @Override
+    public int SaveTorrent(String seedid, File TTorent){
+        try {
+            Path storageDir = Paths.get(config.TORRENT_STORAGE_DIR);
+            if (!Files.exists(storageDir)) {
+                Files.createDirectories(storageDir);
+            }
+            String filename = TTorent.getName();
+            Path target = storageDir.resolve(seedid + "_" + filename);
+            Files.copy(TTorent.toPath(), target, StandardCopyOption.REPLACE_EXISTING);
+
+            EntityManager em = emf.createEntityManager();
+            EntityTransaction tx = em.getTransaction();
+            try {
+                tx.begin();
+                Seed seed = em.find(Seed.class, seedid);
+                seed.url = target.toString();
+                em.merge(seed);
+                tx.commit();
+                return 0;
+            } catch (Exception e) {
+                if (tx.isActive()) tx.rollback();
+                return 1;
+            } finally {
+                em.close();
+            }
+        } catch (Exception e) {
+            return 1;
+        }
+    }
 
     @Override
-    public int SaveTorrent(File TTorent){
-        return 0;
-    };//保存seedid对应的ttorent信息
-
-    @Override
-    public File GetTTorent(String seedid,String userid){
-        return null;
-    };//根据种子id获得ttorent信息然后构建Ttorent文件并返回,同时记录用户的下载行为
-
+    public File GetTTorent(String seedid, String userid, String ip) {
+        EntityManager em = emf.createEntityManager();
+        EntityTransaction tx = em.getTransaction();
+        File file = null;
+        try {
+            Seed seed = em.find(Seed.class, seedid);
+            if (seed == null || seed.url == null) {
+                return null;
+            }
+            file = new File(seed.url);
+            if (!file.exists()) {
+                return null;
+            }
+            tx.begin();
+            SeedDownload sd = new SeedDownload();
+            sd.seedId = seedid;
+            sd.userId = userid;
+            sd.clientIp = ip;
+            LocalDateTime now = LocalDateTime.now();
+            sd.downloadStart = now;
+            sd.downloadEnd = now;
+            em.persist(sd);
+            tx.commit();
+        } catch (Exception e) {
+            if (tx.isActive()) tx.rollback();
+            // ignore persistence errors and still return the file
+        } finally {
+            em.close();
+        }
+        return file;
+    }
 
     @Override
     public int AddRecord(TransRecord rd){
