SHOW:
|
|
- or go back to the newest paste.
1 | //main.js | |
2 | ||
3 | $(function () { | |
4 | 'use strict'; | |
5 | ||
6 | // Initialize the jQuery File Upload widget: | |
7 | $('#fileupload').fileupload({ | |
8 | // Uncomment the following to send cross-domain cookies: | |
9 | //xhrFields: {withCredentials: true}, | |
10 | //url: 'server/php/' | |
11 | }); | |
12 | ||
13 | // Enable iframe cross-domain access via redirect option: | |
14 | $('#fileupload').fileupload( | |
15 | 'option', | |
16 | 'redirect', | |
17 | window.location.href.replace( | |
18 | /\/[^\/]*$/, | |
19 | '/cors/result.html?%s' | |
20 | ) | |
21 | ); | |
22 | ||
23 | if (window.location.hostname === 'blueimp.github.io') { | |
24 | // Demo settings: | |
25 | $('#fileupload').fileupload('option', { | |
26 | url: '//jquery-file-upload.appspot.com/', | |
27 | // Enable image resizing, except for Android and Opera, | |
28 | // which actually support image resizing, but fail to | |
29 | // send Blob objects via XHR requests: | |
30 | disableImageResize: /Android(?!.*Chrome)|Opera/ | |
31 | .test(window.navigator.userAgent), | |
32 | maxFileSize: 5000000, | |
33 | acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i | |
34 | }); | |
35 | // Upload server status check for browsers with CORS support: | |
36 | if ($.support.cors) { | |
37 | $.ajax({ | |
38 | url: '//jquery-file-upload.appspot.com/', | |
39 | type: 'HEAD' | |
40 | }).fail(function () { | |
41 | $('<div class="alert alert-danger"/>') | |
42 | .text('Upload server currently unavailable - ' + | |
43 | new Date()) | |
44 | .appendTo('#fileupload'); | |
45 | }); | |
46 | } | |
47 | } else { | |
48 | // Load existing files: | |
49 | $('#fileupload').addClass('fileupload-processing'); | |
50 | $.ajax({ | |
51 | // Uncomment the following to send cross-domain cookies: | |
52 | //xhrFields: {withCredentials: true}, | |
53 | //url: $('#fileupload').fileupload('option', 'url'), | |
54 | url: '//localhost:8000/tracking/view/', | |
55 | dataType: 'json', | |
56 | context: $('#fileupload')[0] | |
57 | }).always(function () { | |
58 | $(this).removeClass('fileupload-processing'); | |
59 | }).done(function (result) { | |
60 | $(this).fileupload('option', 'done') | |
61 | .call(this, null, {result: result}); | |
62 | }); | |
63 | } | |
64 | ||
65 | }); | |
66 | ||
67 | ||
68 | ||
69 | ||
70 | //models.py | |
71 | class UploadFile(models.Model): | |
72 | files = models.FileField(upload_to="multiupload") | |
73 | slug = models.SlugField(max_length=50, blank=True) | |
74 | ||
75 | def __unicode__(self): | |
76 | return self.file.name | |
77 | ||
78 | @models.permalink | |
79 | def get_absolute_url(self): | |
80 | return ('upload-new', ) | |
81 | ||
82 | def save(self, *args, **kwargs): | |
83 | self.slug = self.file.name | |
84 | super(UploadFile, self).save(*args, **kwargs) | |
85 | ||
86 | def delete(self, *args, **kwargs): | |
87 | """delete -- Remove to leave file.""" | |
88 | self.file.delete(False) | |
89 | super(UploadFile, self).delete(*args, **kwargs) | |
90 | ||
91 | ||
92 | ||
93 | ||
94 | ||
95 | //views.py | |
96 | ||
97 | class UploadFileCreateView(CreateView): | |
98 | model = UploadFile | |
99 | ||
100 | def form_valid(self, form): | |
101 | self.object = form.save() | |
102 | files = [serialize(self.object)] | |
103 | data = {'files': files} | |
104 | response = JSONResponse(data, mimetype=response_mimetype(self.request)) | |
105 | response['Content-Disposition'] = 'inline; filename=files.json' | |
106 | return response | |
107 | class BasicPlusVersionCreateView(UploadFileCreateView): | |
108 | template_name_suffix = '_basicplus_form' | |
109 | ||
110 | class jQueryVersionCreateView(UploadFileCreateView): | |
111 | template_name_suffix = '_jquery_form' | |
112 | ||
113 | class UploadFileDeleteView(DeleteView): | |
114 | model = UploadFile | |
115 | ||
116 | def delete(self, request, *args, **kwargs): | |
117 | self.object = self.get_object() | |
118 | self.object.delete() | |
119 | response = JSONResponse(True, mimetype=response_mimetype(request)) | |
120 | response['Content-Disposition'] = 'inline; filename=files.json' | |
121 | return response | |
122 | ||
123 | ||
124 | class UploadFileListView(ListView): | |
125 | model = UploadFile | |
126 | ||
127 | def render_to_response(self, context, **response_kwargs): | |
128 | files = [ serialize(p) for p in self.get_queryset() ] | |
129 | data = {'files': files} | |
130 | response = JSONResponse(data, mimetype=response_mimetype(self.request)) | |
131 | response['Content-Disposition'] = 'inline; filename=files.json' | |
132 | return response | |
133 | ||
134 | ||
135 | ||
136 | ||
137 | //response.py | |
138 | # encoding: utf-8 | |
139 | from django.http import HttpResponse | |
140 | from django.utils import simplejson | |
141 | ||
142 | MIMEANY = '*/*' | |
143 | MIMEJSON = 'application/json' | |
144 | MIMETEXT = 'text/plain' | |
145 | ||
146 | ||
147 | def response_mimetype(request): | |
148 | """response_mimetype -- Return a proper response mimetype, accordingly to | |
149 | what the client accepts, as available in the `HTTP_ACCEPT` header. | |
150 | ||
151 | request -- a HttpRequest instance. | |
152 | ||
153 | """ | |
154 | can_json = MIMEJSON in request.META['HTTP_ACCEPT'] | |
155 | can_json |= MIMEANY in request.META['HTTP_ACCEPT'] | |
156 | return MIMEJSON if can_json else MIMETEXT | |
157 | ||
158 | ||
159 | class JSONResponse(HttpResponse): | |
160 | """JSONResponse -- Extends HTTPResponse to handle JSON format response. | |
161 | ||
162 | This response can be used in any view that should return a json stream of | |
163 | data. | |
164 | ||
165 | Usage: | |
166 | ||
167 | def a_iew(request): | |
168 | content = {'key': 'value'} | |
169 | return JSONResponse(content, mimetype=response_mimetype(request)) | |
170 | ||
171 | """ | |
172 | def __init__(self, obj='', json_opts=None, mimetype=MIMEJSON, *args, **kwargs): | |
173 | json_opts = json_opts if isinstance(json_opts, dict) else {} | |
174 | content = simplejson.dumps(obj, **json_opts) | |
175 | super(JSONResponse, self).__init__(content, mimetype, *args, **kwargs) | |
176 | ||
177 | ||
178 | ||
179 | //serialize.py | |
180 | ||
181 | # encoding: utf-8 | |
182 | import mimetypes | |
183 | import re | |
184 | from django.core.urlresolvers import reverse | |
185 | ||
186 | ||
187 | def order_name(name): | |
188 | """order_name -- Limit a text to 20 chars length, if necessary strips the | |
189 | middle of the text and substitute it for an ellipsis. | |
190 | ||
191 | name -- text to be limited. | |
192 | ||
193 | """ | |
194 | name = re.sub(r'^.*/', '', name) | |
195 | if len(name) <= 20: | |
196 | return name | |
197 | return name[:10] + "..." + name[-7:] | |
198 | ||
199 | ||
200 | def serialize(instance, file_attr='file'): | |
201 | """serialize -- Serialize a Picture instance into a dict. | |
202 | ||
203 | instance -- Picture instance | |
204 | file_attr -- attribute name that contains the FileField or ImageField | |
205 | ||
206 | """ | |
207 | obj = getattr(instance, file_attr) | |
208 | return { | |
209 | 'url': obj.url, | |
210 | 'name': order_name(obj.name), | |
211 | 'type': mimetypes.guess_type(obj.path)[0] or 'image/png', | |
212 | 'thumbnailUrl': obj.url, | |
213 | 'size': obj.size, | |
214 | 'deleteUrl': reverse('upload-delete', args=[instance.pk]), | |
215 | 'deleteType': 'DELETE', | |
216 | } |