//------------------------------------------------------------------------------ void ofxWebServerUploadRouteHandler::handlePart(const MessageHeader& header, std::istream& stream) { NameValueCollection::ConstIterator iter = header.begin(); // while(iter != header.end()) { // cout << (*iter).first << "=" << (*iter).second << endl; // ++iter; // } // if(header.has("Content-Type")) { string contentType = header["Content-Type"]; if(!isContentTypeValid(contentType)) { ofLogError("ofxWebServerUploadRouteHandler::handlePart") << "Invalid content type: " << contentType; return; // reject } } else { ofLogError("ofxWebServerUploadRouteHandler::handlePart") << "No Content-Type header."; return; } // is this an uploaded file? if(header.has("Content-Disposition")) {// && header.has("form-data")) { string contentDisposition = header["Content-Disposition"]; NameValueCollection parameters; MessageHeader::splitParameters(contentDisposition.begin(),contentDisposition.end(),parameters); if(parameters.has("filename")) { try { ofFile file(settings.uploadFolder + "/" + parameters["filename"], ofFile::WriteOnly); cout << file.getAbsolutePath() << endl; streamsize sz = StreamCopier::copyStream(stream,file); // The section below is from StreamCopier::copyStream, // and can be used for upload progress feedback // int bufferSize = 8192; // Buffer<char> buffer(bufferSize); // streamsize len = 0; // stream.read(buffer.begin(), bufferSize); // streamsize n = stream.gcount(); // while (n > 0) { // len += n; // file.write(buffer.begin(), n); // if (stream && file) { // stream.read(buffer.begin(), bufferSize); // n = stream.gcount(); // cout << n << endl; // } // else n = 0; // } file.close(); } catch(const Exception& exc) { ofLogError("ofxWebServerUploadRouteHandler::handlePart") << exc.displayText(); } catch(const exception& exc) { ofLogError("ofxWebServerUploadRouteHandler::handlePart") << exc.what(); } catch(...) { ofLogError("ofxWebServerUploadRouteHandler::handlePart") << "Uncaught thread exception: Unknown exception."; } } else { // error } } }
void PostRouteFileHandler::handlePart(const Poco::Net::MessageHeader& header, std::istream& stream) { if(header.has("Content-Type")) { std::string contentType = header["Content-Type"]; if(!_parent.getSettings().getValidContentTypes().empty() && !isContentTypeValid(contentType)) { ofLogError("PostRouteFileHandler::handlePart") << "Invalid content type: " << contentType; return; // reject } } else { ofLogError("PostRouteFileHandler::handlePart") << "No Content-Type header."; return; } // is this an uploaded file? if(header.has("Content-Disposition"))// && header.has("form-data")) { std::string contentDisposition = header["Content-Disposition"]; Poco::Net::NameValueCollection parameters; Poco::Net::MessageHeader::splitParameters(contentDisposition.begin(), contentDisposition.end(), parameters); std::string formFileName = parameters.get("filename", ""); std::string formFieldName = parameters.get("name", ""); if(!formFileName.empty()) { try { std::stringstream ss; ss << _parent.getSettings().getUploadFolder(); ss << "/"; ss << Poco::UUIDGenerator::defaultGenerator().createOne().toString(); ss << "."; ss << Poco::Path(formFileName).getExtension(); std::string newFilename = ofToDataPath(ss.str(), true); ofFile file(newFilename, ofFile::WriteOnly); Poco::Net::MediaType contentType(header["Content-Type"]); PostUploadEventArgs args(_sessionUUID, _request, _formUUID, formFieldName, formFileName, newFilename, contentType, 0, PostUploadEventArgs::UPLOAD_STARTING); ofNotifyEvent(_parent.events.onHTTPUploadEvent, args, &_parent); ofLogVerbose("PostRouteFileHandler::handlePart") << "Writing file to absolute path : " << file.getAbsolutePath(); // The section below is from StreamCopier::copyStream, // and might be used for upload progress feedback Poco::Buffer<char> buffer(_parent.getSettings().getWriteBufferSize()); std::streamsize sz = 0; stream.read(buffer.begin(), _parent.getSettings().getWriteBufferSize()); std::streamsize n = stream.gcount(); while (n > 0) { if (sz > _parent.getSettings().getMaximumFileUploadSize()) { ofLogError("PostRouteFileHandler::handlePart") << "File upload size exceeded. Removing file."; file.close(); ofFile::removeFile(newFilename, false); return; } sz += n; file.write(buffer.begin(), n); if (stream && file) { stream.read(buffer.begin(), _parent.getSettings().getWriteBufferSize()); n = stream.gcount(); } else { n = 0; } PostUploadEventArgs args(_sessionUUID, _request, _formUUID, formFieldName, formFileName, newFilename, contentType, sz, PostUploadEventArgs::UPLOAD_PROGRESS); ofNotifyEvent(_parent.events.onHTTPUploadEvent, args, &_parent); } file.close(); PostUploadEventArgs finishedArgs(_sessionUUID, _request, _formUUID, formFieldName, formFileName, newFilename, contentType, sz, PostUploadEventArgs::UPLOAD_FINISHED); ofNotifyEvent(_parent.events.onHTTPUploadEvent, finishedArgs, &_parent); } catch (const Poco::Exception& exc) { ofLogError("PostRouteFileHandler::handlePart") << exc.displayText(); } catch (const std::exception& exc) { ofLogError("PostRouteFileHandler::handlePart") << exc.what(); } catch ( ... ) { ofLogError("PostRouteFileHandler::handlePart") << "Uncaught thread exception: Unknown exception."; } } else { ofLogError("PostRouteFileHandler::handlePart") << "No filename in header."; } } }