class LimitedImageField(ImageField):
def __init__(self, *args, **kwargs):
self.max_upload_size = kwargs.pop('max_upload_size', None)
self.min_dim = kwargs.pop('min_dim', None)
self.max_dim = kwargs.pop('max_dim', None)
if not self.max_upload_size:
self.max_upload_size = settings.FILE_UPLOAD_MAX_MEMORY_SIZE
super(LimitedImageField, self).__init__(*args, **kwargs)
def clean(self, *args, **kwargs):
data = super(LimitedImageField, self).clean(*args, **kwargs)
try:
img_file = data.file
if img_file.size > self.max_upload_size:
err_msg = 'Размер файла не должен превышать {}'.format(filesizeformat(self.max_upload_size))
raise forms.ValidationError(err_msg)
w, h = get_image_dimensions(img_file)
if self.min_dim:
if (w < self.min_dim[0]) or (h < self.min_dim[1]):
err_msg = 'Разрешение изображения не должно быть меньше, чем {}x{}'.format(*self.min_dim)
raise forms.ValidationError(err_msg)
if self.max_dim:
if (w > self.max_dim[0]) or (h > self.max_dim[1]):
err_msg = 'Разрешение изображения не должно превышать {}x{}'.format(*self.max_dim)
raise forms.ValidationError(err_msg)
except AttributeError:
pass
return data
image = LimitedImageField('Изображение', min_dim=(100, 100), max_dim=(300, 300),
help_text='Разрешение от 100x100 до 300х300')
class A:
def __init__(self, name='default'):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value
a = A()
print(a.name)
a.name = 'test'
from datetime import datetime
d1 = datetime(2018, 12, 15, 13)
d2 = datetime(2018, 12, 15, 18)
delta = d2 - d1
print(delta.seconds)
const express = require('express');
const fs = require('fs');
const path = require('path');
const app = express();
app.get('/', function(req, res) {
res.sendFile(path.join(__dirname + '/index.html'));
})
app.get('/audio', function(req, res) {
const path = 'sample.mp3';
const stat = fs.statSync(path);
const fileSize = stat.size;
const range = req.headers.range;
if (range) {
const parts = range.replace(/bytes=/, '').split('-');
const start = parseInt(parts[0], 10);
const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1;
const chunksize = (end-start) + 1;
const file = fs.createReadStream(path, {start, end});
const head = {
'Content-Range': `bytes ${start}-${end}/${fileSize}`,
'Accept-Ranges': 'bytes',
'Content-Length': chunksize,
'Content-Type': 'audio/mpeg',
};
res.writeHead(206, head);
file.pipe(res);
} else {
const head = {
'Content-Length': fileSize,
'Content-Type': 'audio/mpeg',
};
res.writeHead(200, head);
fs.createReadStream(path).pipe(res);
}
});
app.listen(8000, function () {
console.log('Listening on port 8000!');
});
<html>
<head>
<title>Example</title>
</head>
<body>
<audio id="audioPlayer" controls>
<source src="http://localhost:8000/audio" type="audio/mpeg">
</audio>
</body>
</html>
std::string
, но судя по заголовку и тексту разговор о C. Если всё же C и вам не хватает тех функций работы со строками, которые перечислены в заголовочном файле string.h, то можно посмотреть на GLib например. Test.this.outerString
класса innerTest
, что естественно невозможно. А внутри любого метода проблем с доступом у вас не возникнетclass innerTest {
void someMethod() {
Test.this.outerString = "ПОК ПОК ПОК";
// или даже проще
outerString = "ПОК ПОК ПОК";
}
}