Closed ioseb closed 11 years ago
@ioseb რაშემთხვევაში დაგვჭირდება :question:
ფაილზე რა ინფორმაცია მექნება , ფაილურ სისტემაში მისამართი თუ მსგავსი URL cst.ge/day3.pdf
ფაილამდე როგორ მივაღწევ რო ამოცნობა ვცადო ვერ ვხვდები
@demonno
ძალიან ბევრ რამეში დაგვჭირდება. როდესაც @revazi დაასრულებს #8 დავალებას საინტერესო სურათი გვექნება. ვთქვათ შემოვიდა მოთხოვნა:
GET /images/logo.png HTTP/1.1
Host: service.org
თუ მოთხოვნის გაანალიზება წარმატებით გაივლის გვექნება HttpRequestLine
ობიექტი რომელსაც გააჩნია getPath()
მეთოდი რომელზე დაყრდნობითაც შეგვიძლია დავწეროთ ასეთი კოდი:
ServerConfig config = ServerConfig.getInstance();
String requestPath = request.getPath();
String filePath = config.getDocumentRoot() + "/" + requestPath;
File file = new File(filePath);
if (file.exists()) {
if (file.isFile()) {
// აქ ვხსნით ფაილს URL კლასით შენ როგორც გააკეთე
// ვადგენთ შესაძლო MIME ტიპს
// თუ დავადგინეთ
// response.setHeader("Content-Type", [დადგენილი MIME ტიპი]
// response.setHeader("Content-Length", file.length());
// response.write(urlConnection.getInputStream());
} else if (file.isDirectory() && config.listDirectoryContents()) {
// წავკითხოთ ყველა ფაილის სახელი დირექტორიაში, დავაგენერიროთ HTML
// და დავაბრუნოთ response ობიექტის მეშვეობით
}
} else {
// ფაილი ვერ მოიძებნა
// დავადგინოთ გვაქვს თუ არა ამ path - ისთვის რეგისტრირებული სკრიპტი
// თუ გვაქვს მაშინ შევასრულოთ სკრიპტი და რეზულტატი დავაბრუნოთ როგორც text/html
// თუ არ გვაქვს არც სკრიპტი მაშინ:
// response.error(HttpStatus.Code.NOT_FOUND);
}
@ioseb
სანამ დავიწყებ
getDocumentRoot()
ხო არ ჩავამატო properties ფაილში და ServerConfig კლასში ?
თუ რეზოს დაველოდო ..
@demonno
არ ვიცი, არ მგონია. შენთან თუ იმუშავებს სხვასთან არ იმუშავებს და კარგად არის ეგ გასააზრებელი. ასეთ რამეს გთავაზობ:
test
დირექტორიაში განთავსებული resources
დირექტორია რომელშიც განათავსებ შენს ფაილებს.test/resources/filetypes
დირექტორიაში განთავსებული რომელიმე ფაილის path. მგონი საწყის ეტაპზე საკმარისი იქნება.@demonno
მაგალითად წარმოიდგინე რომ გაქვს ფაილი test/resources/filetypes/image.png
და გინდა გადასცე ამ ფაილის მისამართი შენს მაიმ ტიპების იდენტიფიკატორ კლასს. შეგიძლია გააკეთო ასეთი რამე:
class MimeTypeDetectorTest {
@Test
public void testMimeTypeIsImagePNG() {
String path = MimeTypeDetectorTest.class.getResource("/filetypes/image.png").getPath();
String mimeType = MimeTypeDetector.detectMimeType(path);
Assert.assertEquals("image/png", mimeType);
}
}
მაგრამ ზოგადად მაგ კლასის სპეციფიკაციაც მოსაფიქრებელი გვაქვს. რამდენიმე საკითხია:
application/octet-stream
(ეს სავარაუდოდ კონფიგურაციაში უნდა დავამატოთ და თიქეთს გავაკეთებ)კიდევ რაღაც დეტალები მიტრიალებს თავში მაგრამ ბოლომდე ვერ ვიაზრებ ახლა.
@demonno მოკლედ ცოტას კიდევ ვიფიქრებ ამ საკითხებზე. ზოგადი იდეა რაც აქ დავწერე ეგ არის, კიდევ უფრო კარგად ჩამოვაყალიბებ და გეტყვი როგორ უნდა მოვიქცეთ.
@ioseb კარგი, საწყის იმპლემენტციას გავაკეთებ მხოლოდ.
კარგი იქნება, მეც უფრო შენც უფრო მეტი ორიენტირი გაგიჩნდება და მეც.
On Friday, March 1, 2013 at 2:48 AM, Demur Nodia wrote:
@ioseb (https://github.com/ioseb) კარგი, საწყის იმპლემენტციას გავაკეთებ მხოლოდ.
— Reply to this email directly or view it on GitHub (https://github.com/reflooding/serv-cst/issues/10#issuecomment-14262655).
@ioseb ცოტა უცნაურად გავაკეთე მარა სხვანაირად ვერ მოვიფიქრე ჯერ .
public class MimeTypeDetector {
public static String detectedMimeType;
private MimeTypeDetector(String type){
this.detectedMimeType = type;
}
public static MimeTypeDetector detectMimeType(String filePath) throws IOException {
File file = new File(filePath);
String mime = "";
if(file.exists()){
if(file.isFile()){
URL url = new URL("file", "", file.getPath());
URLConnection conn = url.openConnection();
mime = conn.getContentType();
// response.setHeader("Content-Type", [დადგენილი MIME ტიპი]
// response.setHeader("Content-Length", file.length());
// response.write(urlConnection.getInputStream());
} else if( file.isDirectory()){
// წავკითხოთ ყველა ფაილის სახელი დირექტორიაში, დავაგენერიროთ HTML
// და დავაბრუნოთ response ობიექტის მეშვეობით
}
}
return new MimeTypeDetector(mime);
}
public static String getDetectedMimeType() {
return detectedMimeType;
}
}
ტესტი (წარმატებით მუშაობს)
@Test
public void testMimeTypeIsImagePNG() throws IOException {
String path = MimeTypeDetectorTest.class.getResource("/filetypes/img.png").getPath();
String mimeType = String.valueOf(MimeTypeDetector.detectMimeType(path).getDetectedMimeType());
Assert.assertEquals("image/png", mimeType);
}
@demonno საერთო ჯამში ფუნქციონალურად მაგაზე უკეთ ვერ გავაკეთებთ MIME ტიპის დადგენას. დრო დავხარჯე და ჩავუღრმავდი URLConnection - ის უკან მდგომ რეალიზაციას JDK - ს სორსები გავარჩიე. და საკმაოდ ეფექტურად აკეთებს მაგას.
შენ რაც გააკეთე სწორია, თუმცა არქიტექტურულად უნდა გამართვა. რამდენიმე ვარიანტი გვაქვს და უფრო დეტალურად დღეს მოგვიანებით დავწერ. მთავარია რომ მიდგომა თავსითავად სწორია.
P.S. ტესტებს რომ წერთ და არ გეზარებათ უკვე კარგის ნიშანია B-)
@ioseb ხვალე ქორწილში ვარ ქორწინების მოწმე
:laughing: ცოტა ტემპის დაგდება მომიწევს სამწუხაროდ , მაგრამ ავანაზღაურებ შემდეგ დღე-ღამეებში :hand:
@demonno ეგ არაფერი, დრო გაატარე! ჯერ საქმე გვაქვს ის ჯეელები გვაფერხებენ რაღაც იმათ დავმწყემსავ მანამდე :P
@demonno ხაზზე ხარ?
@ioseb კი
მოკლედ ვიფიქრე MIME ტიპების თემაზე, და გარკვეული არქიტექტურული მიდგომა ჩამოვაყალიებ. განწყობა თუ გაქვს დიალოგისთვის გავაკეთებ თიქეთს და განვავრცოთ. @revazi @reflooding @vaxop
@ioseb მზადვარ :D
@ioseb ამ დავალებას მივუბრუნდი ისევ , მხარდაჭერილი mime type
ების enum
კლასი გვჭირდება როგორც ჩანს
mime = "application/octet-stream";
if(mime.equals("content/unknown")){
ესე რო არ ვწერო
მეთოდებზე და ჰედერებზე როგორც არის ისე რო გავაკეთოთ ?
დამიდასტურე და შენს ინსტრუქციას მივყვები
- გააკეთე ტესკი და მიინიჭე
- გააკეთე იმპლემენტაცია
- დაუწერე ტესტები
- რომ დაამთავრებ ჩემზე მოამაგრე ტესკი რევიუ რომ გავაკეთო
კიდევ გადავხედე #20 დავალებას და მგონი ამ კლასის ერთადერთი მთავარი დნიშნულება უნდა იყოს : ფაილის mime type ის დადგენა და დაბრუნება
ამჟამინდელი იმპლემენტაცია @ioseb თუ რამე შენიშვნა გაქვს მომწერე
public static String detectMimeType(String filePath) throws IOException, HttpRequestException {
File file = new File(filePath);
String mime = "";
if(file.exists()){
if(file.isFile()){
URL url = new URL("file", "", file.getPath());
URLConnection conn = url.openConnection();
mime = conn.getContentType();
if(mime.equals("content/unknown")){
mime = "application/octet-stream";
}
} else if( file.isDirectory()){
throw new HttpRequestException(HttpStatus.Code.NOT_FOUND,"File not Found, Directory Located!");
}//დირექტორიაზე ალბათ აღარ იქნება საჭირო შემოწმება Request Handling ში ც მოხდება ეგ
} else {
throw new HttpRequestException(HttpStatus.Code.NOT_FOUND,"File Not Found!");
}
return mime;
}
ტესტები :
@Test
public void testMimeTypeIsImagePNG() throws IOException, HttpRequestException {
String path = MimeTypeDetectorTest.class.getResource("/filetypes/img.png").getPath();
String mimeType = MimeTypeDetector.detectMimeType(path);
Assert.assertEquals("image/png", mimeType);
}
@Test
public void testUnknownMimeType() throws IOException, HttpRequestException {
String path = MimeTypeDetectorTest.class.getResource("/filetypes/bb.brb").getPath();
String mimeType = MimeTypeDetector.detectMimeType(path);
Assert.assertEquals("application/octet-stream", mimeType);
}
ოპააა
- text/javascript
- text/css
ამ ტიპის ფაილებზე URLConnection getContentType()
content/unknown
ს აბრუნებს
პ.ს. :file_folder: ვინდოუსის ფროფერთისებში რომ ვნახულობ ნამდვილად js
და css
ფაილებს ვაძლევ შესამოწმებლად
დემურ, უცნაურია. ჩემთან ახდენს იდენტიფიცირებას. ვნახავ დეტალურად.
Sent from my iPhone
On Mar 9, 2013, at 5:08 PM, Demur Nodia notifications@github.com wrote:
ოპააა
text/javascript text/css ამ ტიპის ფაილებზე URLConnection getContentType() content/unknown ს აბრუნებს
პ.ს. ვინდოუსის ფროფერთისებში რომ ვნახულობ ნამდვილად js და css ფაილებს ვაძლევ შესამოწმებლად
— Reply to this email directly or view it on GitHub.
დემურ,
ძალიან კარგია რომ კვლევა ჩაატარე. URLConnection ყველაზე გამართული და მისაღებია ჩვენი ამოცანისთვის. ჩემი დასკვნა ასეთია:
პირველ ეტაპზე აბსოლუტურად საკმარისი იქნება თუ ამ ტიპების ამოცნობის ავტომატიზაციას მივაღწევთ არსებული საშუალებებით(ანუ URLConnection).
სხვა ნებისმიერი შემთხვევისთვის(ანუ როდესაც ვართ unknown მდგომარეობაში) კონტენტის ტიპი უნდა იყოს:
დამატებით გასარჩევი გექნებათ როგორ მუშაობს "Content-Disposition" (http://tools.ietf.org/html/rfc6266#section-4) HTTP სათაური. ამ შემთხვევაში შესაძლებელია "attachment" ატრიბუტის გამოყენება რაც ბრაუზერს უბიძგებს რომ მომხმარებელს შესთავაზოს ფაილის გადმოწერა ბრაუზერში გახსნის გარეშე.