ฉันจะลงทะเบียนไฟล์ด้วยโปรแกรม Redmine ได้อย่างไร


1

ฉันต้องการเพิ่มไฟล์ลงในเซิร์ฟเวอร์Redmineโดยไม่ต้องผ่านส่วนต่อประสานกราฟิก ฉันกำลังทำให้ไฟล์พร้อมใช้งานกับเซิร์ฟเวอร์ Redmine โดยsvn checkoutกระบวนการแยกต่างหากดังนั้นฉันจึงต้องเพิ่มไฟล์ลงในฐานข้อมูลของ Redmine เอง

เป็นการดีที่ฉันต้องการวิธีแก้ปัญหาที่สามารถเรียกใช้เช่นนี้:

./redmine-register-file /path/to/my/file.ext "with optional description"

redmine/apps/views/files/new.html.erbผมเชื่อว่าส่วนที่เกี่ยวข้องของอินเตอร์เฟซที่พบใน มันเข้าถึงได้โดยindex.html.erbมีส่วนเล็ก ๆ ที่ฉันเชื่อว่ามีความเกี่ยวข้อง:

<div class="contextual">
<%= link_to(l(:label_attachment_new), new_project_file_path(@project), :class => 'icon icon-add') if User.current.allowed_to?(:manage_files, @project) %>
</div>

นี่คือเนื้อหาที่สมบูรณ์ของnew.html.erb:

<h2><%=l(:label_attachment_new)%></h2>

<%= error_messages_for 'attachment' %>
<%= form_tag(project_files_path(@project), :multipart => true, :class => "tabular") do %>
<div class="box">

<% if @versions.any? %>
<p><label for="version_id"><%=l(:field_version)%></label>
<%= select_tag "version_id", content_tag('option', '') +
                             options_from_collection_for_select(@versions, "id", "name") %></p>
<% end %>

<p><label><%=l(:label_attachment_plural)%></label><%= render :partial => 'attachments/form' %></p>
</div>
<%= submit_tag l(:button_add) %>
<% end %>

ฉันไม่รู้ทับทิมที่ดีเลย (มีอะไรเกินprint name.reverseกว่าฉัน) แต่ฉันรู้ว่าโคลอนเหล่านั้นทั้งหมดบ่งบอกถึงตัวเลือก ฉันสามารถรวบรวมข้อมูลใดได้บ้างจากอินเทอร์เฟซมาตรฐานที่จะช่วยฉันในงานของฉันและโซลูชันที่สมบูรณ์แบบนั้นมีลักษณะอย่างไร


ใกล้ชิดกับการแก้ปัญหา:

Redmine ใช้ฐานข้อมูล MySQL เพื่อจัดเก็บการลงทะเบียนไฟล์ ฐานข้อมูลถูกเรียกredmine_productionใช้และใช้สคีมาดังต่อไปนี้:

mysql> SHOW COLUMNS FROM redmine_production.attachments;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| id             | int(11)      | NO   | PRI | NULL    | auto_increment |
| container_id   | int(11)      | YES  | MUL | NULL    |                |
| container_type | varchar(30)  | YES  |     | NULL    |                |
| filename       | varchar(255) | NO   |     |         |                |
| disk_filename  | varchar(255) | NO   |     |         |                |
| filesize       | int(11)      | NO   |     | 0       |                |
| content_type   | varchar(255) | YES  |     |         |                |
| digest         | varchar(40)  | NO   |     |         |                |
| downloads      | int(11)      | NO   |     | 0       |                |
| author_id      | int(11)      | NO   | MUL | 0       |                |
| created_on     | datetime     | YES  | MUL | NULL    |                |
| description    | varchar(255) | YES  |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+
12 rows in set (0.00 sec)

แหล่งทับทิมบางแหล่ง

บางทีนี่อาจจะเป็นการใช้งาน: attachment.rb

คำตอบ:


1

สำหรับผู้ที่มาจากสิ่งนี้โดยเธรด Redmine ที่ฉันสร้างขึ้น: ฉันพยายามโพสต์โซลูชันที่นั่นเช่นกัน แต่ตัวกรองสแปมไม่ยอมให้ฉันติดตามเธรด อาจเป็นเพราะไม่มีการตอบกลับระดับกลาง (* ฉีก *)


ใช้เวลาสักครู่ แต่ฉันคิดออก (ฉันสร้างอินสแตนซ์ทดสอบของ Redmine เพื่อไม่ให้เลอะอะไรกับอินสแตนซ์การผลิตของเราดังนั้นค่าเหล่านี้จึงเป็นค่าเริ่มต้นและควรทำงานให้กับทุกคนที่พยายามทำเช่นนี้)


บทสรุปสั้น ๆ ของกระบวนการ:

  1. ค้นหา ID ภายในของโครงการที่คุณต้องการเพิ่มไฟล์
  2. กำหนดสถิติไฟล์
  3. แทรกไฟล์ลงในฐานข้อมูล

ในความเป็นจริงไม่มีการตรวจสอบฐานข้อมูลเกิดขึ้นดังนั้นแม้ (2) จะเป็นตัวเลือก เช่นนี้ฉันจะไม่ไปดูวิธีรับข้อมูลนั้น (มีทรัพยากรเหลือเฟือแม้กระทั่งบนไซต์นี้ว่าจะรับข้อมูลนี้อย่างไร) ส่วนที่เหลือต้องการความรู้เล็กน้อยว่า Redmine ตั้งฐานข้อมูลอย่างไร


ในการเริ่มต้นนี้เชื่อมต่อฐานข้อมูล MySQL ที่ใช้งานจริงของคุณ (โดยปกติถ้าไม่เสมอredmine_productionไปคุณสามารถแสดงรายการฐานข้อมูล MySQL ทั้งหมดด้วยคำสั่งSHOW DATABASES;)

ตอนนี้ค้นหา ID ของโครงการของคุณที่คุณต้องการเพิ่มไฟล์ container_idในคอลัมน์รายชื่อข้างต้นนี้จะถูกแทรกเป็น

mysql> SELECT * FROM projects;
+----+----------------+-------------+----------+-----------+-----------+---------------------+---------------------+----------------+--------+------+------+
| id | name           | description | homepage | is_public | parent_id | created_on          | updated_on          | identifier     | status | lft  | rgt  |
+----+----------------+-------------+----------+-----------+-----------+---------------------+---------------------+----------------+--------+------+------+
|  1 | git-helloworld | NULL        |          |         1 |      NULL | 2012-01-01 13:00:00 | 2012-01-01 13:00:00 | git-helloworld |      1 |    1 |    2 |
|  2 | bzr-helloworld | NULL        |          |         1 |      NULL | 2012-01-01 13:00:00 | 2012-01-01 13:00:00 | bzr-helloworld |      1 |    1 |    2 |
|  3 | hg-helloworld  | NULL        |          |         1 |      NULL | 2012-01-01 13:00:00 | 2012-01-01 13:00:00 | hg-helloworld  |      1 |    1 |    2 |
|  4 | svn-helloworld | NULL        |          |         1 |      NULL | 2012-01-01 13:00:00 | 2012-01-01 13:00:00 | svn-helloworld |      1 |    1 |    2 |
+----+----------------+-------------+----------+-----------+-----------+---------------------+---------------------+----------------+--------+------+------+
4 rows in set (0.00 sec)

ในตัวอย่างนี้เราต้องการเพิ่มไฟล์ไปgit-helloworldดังนั้น ID 1ของเราคือ ดังนั้นเพื่อเพิ่มไฟล์ไปยังฐานข้อมูลเราจะดำเนินการคำสั่ง SQL:

INSERT INTO attachments (container_id, container_type,
                         filename, disk_filename, digest) VALUES (
       1, 'Project',
       'Some File Name', 'file-name-on-disk', '0123456789abcdef');

หมายเหตุเกี่ยวกับฟิลด์เหล่านี้:

  • container_id: ID ของโครงการที่คุณต้องการรวมไฟล์ไว้
  • container_type: ชนิดของคอนเทนเนอร์นี่คือ; เพื่อจุดประสงค์นี้มันอยู่เสมอ Project
  • filename: สตริงที่จะแสดงเป็นชื่อไฟล์
  • disk_filename: เส้นทางที่แท้จริงของไฟล์เทียบกับ /var/www/redmine/files/
  • digest: สตริงที่แสดงการตรวจสอบ MD5 ของไฟล์

ไม่จำเป็นต้องกรอก แต่จำเป็นต้องกรอก:

  • filesize: ขนาดของไฟล์เป็นจำนวนเต็ม ฉันถือว่านี่น่าจะเป็นไบต์หรือกิโลไบต์ แต่ฉันไม่รู้ว่ามันสำคัญหรือไม่
  • author_id: ผู้ใช้เชื่อมโยงไฟล์ด้วย adminสำหรับวัตถุประสงค์ของฉันฉันจะใช้ โปรดทราบว่าคุณจะได้รับรายชื่อผู้ใช้ Redmine SELECT * FROM users;กับ
  • description: คำอธิบายไฟล์ (นี่เป็นคำอธิบายที่เป็นทางเลือกเดียวกับที่ใช้ในอินเทอร์เฟซ)
  • content_type: ฉันจะถือว่านี่เป็นประเภทเนื้อหา MIME
  • created_on: วันที่ไฟล์นี้ถูกสร้างขึ้น

สำหรับประเภทที่ชัดเจนของสิ่งเหล่านี้ทั้งหมดอ้างอิงถึงรายการคอลัมน์ในโพสต์ต้นฉบับ

ถัดไปตรวจสอบให้แน่ใจว่าเส้นทางdisk_filenameนั้นมีอยู่จริงเมื่อเทียบกับredmine/files/ไดเรกทอรีของคุณ (หมายเหตุนี่หมายความว่าคุณสามารถจัดระเบียบมันได้จริง!) คุณไม่จำเป็นต้องทำเช่นนี้ แต่คุณจะได้รับ 404 ถ้าไฟล์ไม่อยู่ที่นั่น

หลังจากนั้นคุณควรจะไป!

พิสูจน์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.